你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

强制跨自己的服务器代理呼叫流量

在此教程中,了解如何在自己的服务器上代理 Azure 通信服务呼叫流量。

在某些情况下,将所有客户端流量都代理到可以控制的服务器可能会很有用。 初始化 SDK 时,可提供要路由流量的服务器的详细信息。 启用后,所有媒体流量(音频/视频/屏幕共享)都通过提供的 TURN 服务器而不是 Azure 通信服务默认值传输。

本教程介绍如何执行下列操作:

  • 设置 TURN 服务器。
  • 设置信号代理服务器。

先决条件

代理功能从 Azure 通信服务通话 SDK 的公共版本 1.25.1 开始正式发布。 尝试使用此功能时,请确保使用此 SDK 或更高版本的 SDK。 本教程中使用的是通话 SDK 1.13.0-beta.1 版本,这是此功能首次推出公共预览版的版本。

代理呼叫媒体流量

以下部分介绍如何代理并调用媒体流量。

什么是 TURN 服务器?

很多时候,在两个 Peer 节点之间建立网络连接并不简单。 由于以下原因,直接连接可能无法正常工作:

  • 具有严格规则的防火墙。
  • 位于专用网络后的对等机。
  • 在网络地址转换 (NAT) 环境中运行的计算机。

若要解决这些网络连接问题,可使用采用围绕 NAT 使用中继的遍历 (TURN) 协议以中继网络流量的服务器。 NAT 会话遍历实用工具 (STUN) 和 TURN 服务器是中继服务器。

向 SDK 提供 TURN 服务器详细信息

若要提供 TURN 服务器的详细信息,需要传递在初始化 CallClient 时要用作 CallClientOptions 的一部分的 TURN 服务器的详细信息。 有关如何设置呼叫的详细信息,请参阅 Azure 通信服务 Web SDK,获取有关如何设置语音和视频的快速入门。

import { CallClient } from '@azure/communication-calling'; 

const myTurn1 = {
    urls: [
        'turn:turn.azure.com:3478?transport=udp',
        'turn:turn1.azure.com:3478?transport=udp',
    ],
    username: 'turnserver1username',
    credential: 'turnserver1credentialorpass'
};

const myTurn2 = {
    urls: [
        'turn:20.202.255.255:3478',
        'turn:20.202.255.255:3478?transport=tcp',
    ],
    username: 'turnserver2username',
    credential: 'turnserver2credentialorpass'
};

// While you are creating an instance of the CallClient (the entry point of the SDK):
const callClient = new CallClient({
    networkConfiguration: {
        turn: {
            iceServers: [
                myTurn1,
                myTurn2
            ]
        }
    }
});




// ...continue normally with your SDK setup and usage.

重要

如果在初始化 CallClient 时提供了 TURN 服务器详细信息,则所有媒体流量专门流经这些 TURN 服务器。 尝试在对等机之间建立连接时,不会考虑在创建呼叫时通常生成的任何其他 ICE 候选项。 这意味着只考虑 relay 候选项。 若要详细了解不同类型的 ICE 候选项,请参阅 RTCIceCandidate:type 属性

如果 ?transport 查询参数不作为 TURN URL 的一部分存在,或者不是 udptcptls 值之一,则默认行为是 UDP。

如果提供的任何 URL 无效或没有 turn:turns:stun: 架构之一,则 CallClient 初始化失败并相应地引发错误。 如果遇到问题,引发的错误消息应有助于进行故障排除。

有关 CallClientOptions 对象的 API 引用及其中的 networkConfiguration 属性,请参阅 CallClientOptions

在 Azure 中设置 TURN 服务器

可在 Azure 门户中创建 Linux 虚拟机。 有关详细信息,请参阅快速入门:在 Azure 门户中创建 Linux 虚拟机。 若要部署 TURN 服务器,请使用 coturn。 Coturn 是用于 VoIP 和 WebRTC 的 TURN 和 STUN 服务器的免费开源实现。

设置 TURN 服务器后,可使用 WebRTC Trickle ICE 网页上的说明对其进行测试。

代理信号流量

若要提供代理服务器的 URL,需要在初始化 CallClient 时将其作为 CallClientOptions 的一部分传入。 有关如何设置呼叫的详细信息,请参阅 Azure 通信服务 Web SDK,获取有关如何设置语音和视频的快速入门。

import { CallClient } from '@azure/communication-calling'; 

// While you are creating an instance of the CallClient (the entry point of the SDK):
const callClient = new CallClient({
    networkConfiguration: {
        proxy: {
            url: 'https://myproxyserver.com'
        }
    }
});

// ...continue normally with your SDK setup and usage.

注意

如果提供的代理 URL 无效,则 CallClient 初始化失败并相应地引发错误。 如果遇到问题,引发的错误消息有助于进行故障排除。

有关 CallClientOptions 对象的 API 引用及其中的 networkConfiguration 属性,请参阅 CallClientOptions

在 Express.js 中设置信号代理中间件

还可在 Express.js 服务器设置中创建代理中间件,以使用 http-proxy-middleware npm 包重定向所有 URL。 该包中的 createProxyMiddleware 函数应涵盖简单重定向代理设置所需的功能。 以下是它的一个示例用法和一些选项设置,SDK 需要这些选项设置以使所有 URL 按预期工作:

const proxyRouter = (req) => {
    // Your router function if you don't intend to set up a direct target

    // An example:
    if (!req.originalUrl && !req.url) {
        return '';
    }

    const incomingUrl = req.originalUrl || req.url;
    if (incomingUrl.includes('/proxy')) {
        return 'https://microsoft.com/forwarder/';
    }
    
    return incomingUrl;
}

const myProxyMiddleware = createProxyMiddleware({
    target: 'https://microsoft.com', // This will be ignored if a router function is provided, but createProxyMiddleware still requires this to be passed in (see its official docs on the npm page for the most recent changes)
    router: proxyRouter,
    changeOrigin: true,
    secure: false, // If you have proper SSL setup, set this accordingly
    followRedirects: true,
    ignorePath: true,
    ws: true,
    logLevel: 'debug'
});

// And finally pass in your proxy middleware to your express app depending on your URL/host setup
app.use('/proxy', myProxyMiddleware);

提示

如果遇到 SSL 问题,请参阅 cors 包。

在 Azure 上设置信号代理服务器

可在 Azure 门户中创建 Linux 虚拟机,并在其上部署 NGINX 服务器。 有关详细信息,请参阅快速入门:在 Azure 门户中创建 Linux 虚拟机

下面是一个可用作示例的 NGINX 配置:

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}

代理功能将不适用于 Teams 标识和 Azure 通信服务 Teams 互操作性操作

代理呼叫媒体流量

以下部分介绍如何代理并调用媒体流量。

什么是 TURN 服务器?

很多时候,在两个 Peer 节点之间建立网络连接并不简单。 由于以下原因,直接连接可能无法正常工作:

  • 具有严格规则的防火墙。
  • 位于专用网络后的对等机。
  • 在网络地址转换 (NAT) 环境中运行的计算机。

若要解决这些网络连接问题,可使用采用围绕 NAT 使用中继的遍历 (TURN) 协议以中继网络流量的服务器。 NAT 会话遍历实用工具 (STUN) 和 TURN 服务器是中继服务器。

使用 SDK 提供 TURN 服务器详细信息

若要提供 TURN 服务器的详细信息,需要传递在初始化 CallClient 时要用作 CallClientOptions 的一部分的 TURN 服务器的详细信息。 有关如何设置呼叫的详细信息,请参阅 Azure 通信服务 iOS SDK,获取有关如何设置语音和视频的快速入门。

let callClientOptions = new CallClientOptions()
let callNetworkOptions = new CallNetworkOptions()

let iceServer = IceServer()
iceServer.urls = ["turn:20.202.255.255"]
iceServer.udpPort = 3478
iceServer.realm = "turn.azure.com"
iceServer.username = "turnserver1username"
iceServer.password = "turnserver1password"

callNetworkOptions.iceServers = [iceServer]

// Supply the network options when creating an instance of the CallClient
callClientOptions.network = callNetworkOptions
self.callClient = CallClient(options: callClientOptions);

重要

如果在初始化 CallClient 时提供了 TURN 服务器详细信息,则所有媒体流量专门流经这些 TURN 服务器。 尝试在对等机之间建立连接时,不会考虑在创建呼叫时通常生成的任何其他 ICE 候选项。 这意味着只考虑 relay 候选项。 若要详细了解不同类型的 ICE 候选项,请参阅 RTCIceCandidate:type 属性

目前,Android SDK 仅支持媒体代理的单个 IPv4 地址 和 UDP 协议。 如果未提供 UDP 端口,则使用默认 UDP 端口 3478。 当使用不受支持的输入来调用 setIceServer 时,SDK 会引发“Failed to set media proxy”错误,如下所示:

  • IceServers 列表中提供了多个 ICE 服务器。
  • IceServer 的 URL 列表中提供了多个 URL。
  • URL 列表中提供了 IPv6 URL。
  • 仅提供 TCP 端口。
  • 未提供领域信息。

如果提供的 ICE 服务器信息无效,则 CallClient 初始化失败并相应地引发错误。

在 Azure 中设置 TURN 服务器

可在 Azure 门户中创建 Linux 虚拟机。 有关详细信息,请参阅快速入门:在 Azure 门户中创建 Linux 虚拟机。 若要部署 TURN 服务器,请使用 coturn。 Coturn 是用于 VoIP 和 WebRTC 的 TURN 和 STUN 服务器的免费开源实现。

设置 TURN 服务器后,可使用 WebRTC Trickle ICE 网页上的说明对其进行测试。

代理信号流量

要提供代理服务器的 URL,需要在初始化 CallClient 时通过其属性 Network 作为 CallClientOptions 的一部分传入。 有关如何设置呼叫的详细信息,请参阅 Azure 通信服务 iOS SDK,获取有关如何设置语音和视频的快速入门。

let callClientOptions = CallClientOptions()
let callNetworkOptions = CallNetworkOptions()
callNetworkOptions.proxyUrl = proxyUrl
callClientOptions.network = callNetworkOptions
self.callClient = CallClient(options: callClientOptions)

// ...continue normally with your SDK setup and usage.

在 Azure 上设置信号代理服务器

可在 Azure 门户中创建 Linux 虚拟机,并在其上部署 NGINX 服务器。 有关详细信息,请参阅快速入门:在 Azure 门户中创建 Linux 虚拟机

下面是一个可用作示例的 NGINX 配置:

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}

代理功能将不适用于 Teams 标识和 Azure 通信服务 Teams 互操作性操作

代理呼叫媒体流量

以下部分介绍如何代理并调用媒体流量。

什么是 TURN 服务器?

很多时候,在两个 Peer 节点之间建立网络连接并不简单。 由于以下原因,直接连接可能无法正常工作:

  • 具有严格规则的防火墙。
  • 位于专用网络后的对等机。
  • 在网络地址转换 (NAT) 环境中运行的计算机。

若要解决这些网络连接问题,可使用采用围绕 NAT 使用中继的遍历 (TURN) 协议以中继网络流量的服务器。 NAT 会话遍历实用工具 (STUN) 和 TURN 服务器是中继服务器。

使用 SDK 提供 TURN 服务器详细信息

若要提供 TURN 服务器的详细信息,需要传递在初始化 CallClient 时要用作 CallClientOptions 的一部分的 TURN 服务器的详细信息。 有关如何设置呼叫的详细信息,请参阅 Azure 通信服务 Android SDK,获取有关如何设置语音和视频的快速入门。

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();

IceServer iceServer = new IceServer();
iceServer.setUrls(Arrays.asList("turn:20.202.255.255"));
iceServer.setUdpPort(3478);
iceServer.setRealm("turn.azure.com"); // Realm information is required.
iceServer.setUsername("turnserver1username");
iceServer.setPassword("turnserver1password");

callNetworkOptions.setIceServers(Arrays.asList(iceServer));

// Supply the network options when creating an instance of the CallClient
callClientOptions.setNetwork(callNetworkOptions);
CallClient callClient = new CallClient(callClientOptions);

重要

如果在初始化 CallClient 时提供了 TURN 服务器详细信息,则所有媒体流量专门流经这些 TURN 服务器。 尝试在对等机之间建立连接时,不会考虑在创建呼叫时通常生成的任何其他 ICE 候选项。 这意味着只考虑 relay 候选项。 若要详细了解不同类型的 ICE 候选项,请参阅 RTCIceCandidate:type 属性

目前,Android SDK 仅支持媒体代理的单个 IPv4 地址 和 UDP 协议。 如果未提供 UDP 端口,则使用默认 UDP 端口 3478。 当使用不受支持的输入来调用 setIceServer 时,SDK 会引发“Failed to set media proxy”错误,如下所示:

  • IceServers 列表中提供了多个 ICE 服务器。
  • IceServer 的 URL 列表中提供了多个 URL。
  • URL 列表中提供了 IPv6 URL。
  • 仅提供 TCP 端口。
  • 未提供领域信息。

如果提供的 ICE 服务器信息无效,则 CallClient 初始化失败并相应地引发错误。

在 Azure 中设置 TURN 服务器

可在 Azure 门户中创建 Linux 虚拟机。 有关详细信息,请参阅快速入门:在 Azure 门户中创建 Linux 虚拟机。 若要部署 TURN 服务器,请使用 coturn。 Coturn 是用于 VoIP 和 WebRTC 的 TURN 和 STUN 服务器的免费开源实现。

设置 TURN 服务器后,可使用 WebRTC Trickle ICE 网页上的说明对其进行测试。

代理信号流量

要提供代理服务器的 URL,需要在初始化 CallClient 时通过其属性 Network 作为 CallClientOptions 的一部分传入。 有关如何设置呼叫的详细信息,请参阅 Azure 通信服务 Android SDK,获取有关如何设置语音和视频的快速入门。

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();
callNetworkOptions.setProxyUrl("https://myproxyserver.com");
callClientOptions.setNetwork(callNetworkOptions);
CallClient callClient = new CallClient(callClientOptions);

// ...continue normally with your SDK setup and usage.

在 Azure 上设置信号代理服务器

可在 Azure 门户中创建 Linux 虚拟机,并在其上部署 NGINX 服务器。 有关详细信息,请参阅快速入门:在 Azure 门户中创建 Linux 虚拟机

下面是一个可用作示例的 NGINX 配置:

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}

代理功能将不适用于 Teams 标识和 Azure 通信服务 Teams 互操作性操作

代理呼叫媒体流量

以下部分介绍如何代理并调用媒体流量。

什么是 TURN 服务器?

很多时候,在两个 Peer 节点之间建立网络连接并不简单。 由于以下原因,直接连接可能无法正常工作:

  • 具有严格规则的防火墙。
  • 位于专用网络后的对等机。
  • 在网络地址转换 (NAT) 环境中运行的计算机。

若要解决这些网络连接问题,可使用采用围绕 NAT 使用中继的遍历 (TURN) 协议以中继网络流量的服务器。 NAT 会话遍历实用工具 (STUN) 和 TURN 服务器是中继服务器。

使用 SDK 提供 TURN 服务器详细信息

若要提供 TURN 服务器的详细信息,需要传递在初始化 CallClient 时要用作 CallClientOptions 的一部分的 TURN 服务器的详细信息。 有关如何设置呼叫的详细信息,请参阅 Azure 通信服务 Windows SDK,获取有关如何设置语音和视频的快速入门。

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();

IceServer iceServer = new IceServer();
iceServer.Uris = new List<Uri>() { new Uri("turn:20.202.255.255") }.AsReadOnly();
iceServer.UdpPort = 3478;
iceServer.Realm = "turn.azure.com";
iceServer.Username = "turnserver1username";
iceServer.Password = "turnserver1password";

callNetworkOptions.IceServers = new List<IceServer>() { iceServer }.AsReadOnly();

// Supply the network options when creating an instance of the CallClient
callClientOptions.Network = callNetworkOptions;
CallClient callClient = new CallClient(callClientOptions);

重要

如果在初始化 CallClient 时提供了 TURN 服务器详细信息,则所有媒体流量专门流经这些 TURN 服务器。 尝试在对等机之间建立连接时,不会考虑在创建呼叫时通常生成的任何其他 ICE 候选项。 这意味着只考虑 relay 候选项。 若要详细了解不同类型的 ICE 候选项,请参阅 RTCIceCandidate:type 属性

目前,Android SDK 仅支持媒体代理的单个 IPv4 地址 和 UDP 协议。 如果未提供 UDP 端口,则使用默认 UDP 端口 3478。 当使用不受支持的输入来调用 setIceServer 时,SDK 会引发“Failed to set media proxy”错误,如下所示:

  • IceServers 列表中提供了多个 ICE 服务器。
  • IceServer 的 URL 列表中提供了多个 URL。
  • URL 列表中提供了 IPv6 URL。
  • 仅提供 TCP 端口。
  • 未提供领域信息。

如果提供的 ICE 服务器信息无效,则 CallClient 初始化失败并相应地引发错误。

在 Azure 中设置 TURN 服务器

可在 Azure 门户中创建 Linux 虚拟机。 有关详细信息,请参阅快速入门:在 Azure 门户中创建 Linux 虚拟机。 若要部署 TURN 服务器,请使用 coturn。 Coturn 是用于 VoIP 和 WebRTC 的 TURN 和 STUN 服务器的免费开源实现。

设置 TURN 服务器后,可使用 WebRTC Trickle ICE 网页上的说明对其进行测试。

代理信号流量

要提供代理服务器的 URL,需要在初始化 CallClient 时通过其属性 Network 作为 CallClientOptions 的一部分传入。 有关如何设置呼叫的详细信息,请参阅 Azure 通信服务 Windows SDK,获取有关如何设置语音和视频的快速入门。

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();
callNetworkOptions.ProxyUri = new Uri("https://myproxyserver.com");
callClientOptions.Network = callNetworkOptions;
CallClient callClient = new CallClient(callClientOptions);

// ...continue normally with your SDK setup and usage.

在 Azure 上设置信号代理服务器

可在 Azure 门户中创建 Linux 虚拟机,并在其上部署 NGINX 服务器。 有关详细信息,请参阅快速入门:在 Azure 门户中创建 Linux 虚拟机

下面是一个可用作示例的 NGINX 配置:

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}