Delen via


Afdwingen dat het aanroepen van verkeer wordt geproxied op uw eigen server

In deze zelfstudie leert u hoe u uw Azure Communication Services-aanroepverkeer proxyt op uw eigen servers.

In bepaalde situaties kan het handig zijn om al uw clientverkeer te laten doorsturen naar een server die u kunt beheren. Wanneer de SDK wordt geïnitialiseerd, kunt u de details opgeven van uw servers waarnaar u het verkeer wilt routeren. Zodra dit is ingeschakeld, gaat al het mediaverkeer (audio/video/scherm delen) door de opgegeven TURN-servers in plaats van de standaardinstellingen van Azure Communication Services.

In deze zelfstudie leert u het volgende:

  • Stel een TURN-server in.
  • Stel een signaleringsproxyserver in.

Vereisten

Geen

De proxyfunctie is algemeen beschikbaar vanaf de openbare versie 1.25.1 van azure Communication Services Calling SDK. Zorg ervoor dat u deze SDK of een latere versie van de SDK gebruikt wanneer u deze functie probeert te gebruiken. In deze zelfstudie wordt een versie van de Calling SDK 1.13.0-beta.1 gebruikt, waarbij deze functie voor het eerst beschikbaar werd in openbare preview.

Mediaverkeer via proxy aanroepen

In de volgende secties wordt beschreven hoe u uw mediaverkeer via proxy kunt aanroepen.

Wat is een TURN-server?

Vaak is het tot stand brengen van een netwerkverbinding tussen twee peers niet eenvoudig. Een directe verbinding werkt mogelijk niet vanwege:

  • Firewalls met strikte regels.
  • Peers die achter een particulier netwerk zitten.
  • Computers die worden uitgevoerd in een NAT-omgeving (Network Address Translation).

Als u deze problemen met de netwerkverbinding wilt oplossen, kunt u een server gebruiken die gebruikmaakt van het Traversal Using Relay NAT-protocol (TURN) voor het doorsturen van netwerkverkeer. Session Traversal Utilities for NAT (STUN) en TURN-servers zijn de relayservers.

Geef de DETAILS van uw TURN-server op voor de SDK

Als u de details van uw TURN-servers wilt opgeven, moet u details doorgeven over welke TURN-server moet worden gebruikt als onderdeel van CallClientOptions het initialiseren CallClient. Zie de Azure Communication Services-web-SDK voor de quickstart over het instellen van spraak en video voor meer informatie over het instellen van een gesprek.

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.

Belangrijk

Als u uw TURN-servergegevens hebt opgegeven tijdens het initialiseren CallClient, stroomt al het mediaverkeer uitsluitend via deze TURN-servers. Alle andere ICE-kandidaten die normaal gesproken worden gegenereerd wanneer u een oproep maakt, worden niet meegenomen bij het tot stand brengen van connectiviteit tussen peers. Dat betekent dat alleen relay kandidaten worden overwogen. Zie RTCIceCandidate: type eigenschap voor meer informatie over verschillende soorten Ice-kandidaten.

Als de ?transport queryparameter niet aanwezig is als onderdeel van de TURN-URL of geen van de udp, tcpof tls waarden is, is het standaardgedrag UDP.

Als een van de opgegeven URL's ongeldig is of geen van de turn:, turns:of stun: schema's heeft, mislukt de CallClient initialisatie en genereert deze fouten dienovereenkomstig. De foutberichten die worden gegenereerd, kunnen u helpen bij het oplossen van problemen als u problemen ondervindt.

Zie CallClientOptions voor de API-verwijzing voor het CallClientOptions object en de networkConfiguration eigenschap erin.

Een TURN-server instellen in Azure

U kunt een virtuele Linux-machine maken in Azure Portal. Zie quickstart: Een virtuele Linux-machine maken in Azure Portal voor meer informatie. Als u een TURN-server wilt implementeren, gebruikt u coturn. Coturn is een gratis en opensource-implementatie van een TURN- en STUN-server voor VoIP en WebRTC.

Nadat u een TURN-server hebt ingesteld, kunt u deze testen met behulp van de instructies op de WebRTC Trickle ICE-webpagina .

Proxysignaalverkeer

Als u de URL van een proxyserver wilt opgeven, moet u deze doorgeven als onderdeel van CallClientOptions het initialiseren CallClient. Zie de Azure Communication Services-web-SDK voor de quickstart over het instellen van spraak en video voor meer informatie over het instellen van een gesprek.

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.

Notitie

Als de opgegeven proxy-URL een ongeldige URL is, mislukt de CallClient initialisatie en genereert deze fouten dienovereenkomstig. De foutberichten die worden gegenereerd, helpen u bij het oplossen van problemen als u problemen ondervindt.

Zie CallClientOptions voor de API-verwijzing voor het CallClientOptions object en de networkConfiguration eigenschap erin.

Een signaalproxy-middleware instellen in Express.js

U kunt ook een proxy-middleware maken in de installatie van uw Express.js-server om alle URL's te laten doorsturen met behulp van het npm-pakket http-proxy-middleware . De createProxyMiddleware functie van dat pakket moet betrekking hebben op wat u nodig hebt voor een eenvoudige omleidingsproxy-installatie. Hier volgt een voorbeeld van het gebruik ervan met enkele optie-instellingen die de SDK nodig heeft, zodat al onze URL's werken zoals verwacht:

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);

Tip

Als u SSL-problemen ondervindt, raadpleegt u het cors-pakket .

Een signaleringsproxyserver instellen in Azure

U kunt een virtuele Linux-machine maken in Azure Portal en er een NGINX-server op implementeren. Zie quickstart: Een virtuele Linux-machine maken in Azure Portal voor meer informatie.

Hier volgt een NGINX-configuratie die u als voorbeeld kunt gebruiken:

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;
        }
    }
}

De proxyfunctie is niet beschikbaar voor Teams-identiteiten en Interoperabiliteitsacties van Azure Communication Services Teams.

Mediaverkeer via proxy aanroepen

In de volgende secties wordt beschreven hoe u uw mediaverkeer via proxy kunt aanroepen.

Wat is een TURN-server?

Vaak is het tot stand brengen van een netwerkverbinding tussen twee peers niet eenvoudig. Een directe verbinding werkt mogelijk niet vanwege:

  • Firewalls met strikte regels.
  • Peers die achter een particulier netwerk zitten.
  • Computers die worden uitgevoerd in een NAT-omgeving (Network Address Translation).

Als u deze problemen met de netwerkverbinding wilt oplossen, kunt u een server gebruiken die gebruikmaakt van het Traversal Using Relay NAT-protocol (TURN) voor het doorsturen van netwerkverkeer. Session Traversal Utilities for NAT (STUN) en TURN-servers zijn de relayservers.

Geef uw TURN-servergegevens op met de SDK

Als u de details van uw TURN-servers wilt opgeven, moet u details doorgeven over welke TURN-server moet worden gebruikt als onderdeel van CallClientOptions het initialiseren CallClient. Zie de Azure Communication Services iOS SDK voor de quickstart over het instellen van spraak en video voor meer informatie over het instellen van een gesprek.

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);

Belangrijk

Als u uw TURN-servergegevens hebt opgegeven tijdens het initialiseren CallClient, stroomt al het mediaverkeer uitsluitend via deze TURN-servers. Alle andere ICE-kandidaten die normaal gesproken worden gegenereerd wanneer u een oproep maakt, worden niet meegenomen bij het tot stand brengen van connectiviteit tussen peers. Dat betekent dat alleen relay kandidaten worden overwogen. Zie RTCIceCandidate: type eigenschap voor meer informatie over verschillende soorten Ice-kandidaten.

Momenteel ondersteunt de Android SDK slechts één IPv4-adres en UDP-protocol voor mediaproxy. Als er geen UDP-poort is opgegeven, wordt er een standaard UDP-poort 3478 gebruikt. De SDK genereert als volgt een Failed to set media proxy fout bij het aanroepen setIceServer met niet-ondersteunde invoer:

  • Er is meer dan één ICE-server beschikbaar in de lijst IceServers.
  • Er wordt meer dan één URL opgegeven in de URL-lijst van IceServer.
  • De IPv6-URL wordt opgegeven in de URL-lijst.
  • Er is alleen TCP-poort opgegeven.
  • Realm-informatie is niet opgegeven.

Als de verstrekte ICE-servergegevens ongeldig zijn, mislukt de CallClient initialisatie en genereert deze fouten dienovereenkomstig.

Een TURN-server instellen in Azure

U kunt een virtuele Linux-machine maken in Azure Portal. Zie quickstart: Een virtuele Linux-machine maken in Azure Portal voor meer informatie. Als u een TURN-server wilt implementeren, gebruikt u coturn. Coturn is een gratis en opensource-implementatie van een TURN- en STUN-server voor VoIP en WebRTC.

Nadat u een TURN-server hebt ingesteld, kunt u deze testen met behulp van de instructies op de WebRTC Trickle ICE-webpagina .

Proxysignaalverkeer

Als u de URL van een proxyserver wilt opgeven, moet u deze doorgeven als onderdeel van de eigenschap Network tijdens CallClientOptions het initialiserenCallClient. Zie de Azure Communication Services iOS SDK voor de quickstart over het instellen van spraak en video voor meer informatie over het instellen van een gesprek.

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.

Een signaleringsproxyserver instellen in Azure

U kunt een virtuele Linux-machine maken in Azure Portal en er een NGINX-server op implementeren. Zie quickstart: Een virtuele Linux-machine maken in Azure Portal voor meer informatie.

Hier volgt een NGINX-configuratie die u als voorbeeld kunt gebruiken:

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;
        }
    }
}

De proxyfunctie is niet beschikbaar voor Teams-identiteiten en Interoperabiliteitsacties van Azure Communication Services Teams.

Mediaverkeer via proxy aanroepen

In de volgende secties wordt beschreven hoe u uw mediaverkeer via proxy kunt aanroepen.

Wat is een TURN-server?

Vaak is het tot stand brengen van een netwerkverbinding tussen twee peers niet eenvoudig. Een directe verbinding werkt mogelijk niet vanwege:

  • Firewalls met strikte regels.
  • Peers die achter een particulier netwerk zitten.
  • Computers die worden uitgevoerd in een NAT-omgeving (Network Address Translation).

Als u deze problemen met de netwerkverbinding wilt oplossen, kunt u een server gebruiken die gebruikmaakt van het Traversal Using Relay NAT-protocol (TURN) voor het doorsturen van netwerkverkeer. Session Traversal Utilities for NAT (STUN) en TURN-servers zijn de relayservers.

Geef uw TURN-servergegevens op met de SDK

Als u de details van uw TURN-servers wilt opgeven, moet u details doorgeven over welke TURN-server moet worden gebruikt als onderdeel van CallClientOptions het initialiseren CallClient. Zie Azure Communication Services Android SDK voor de quickstart over het instellen van spraak en video voor meer informatie over het instellen van een gesprek.

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);

Belangrijk

Als u uw TURN-servergegevens hebt opgegeven tijdens het initialiseren CallClient, stroomt al het mediaverkeer uitsluitend via deze TURN-servers. Alle andere ICE-kandidaten die normaal gesproken worden gegenereerd wanneer u een oproep maakt, worden niet meegenomen bij het tot stand brengen van connectiviteit tussen peers. Dat betekent dat alleen relay kandidaten worden overwogen. Zie RTCIceCandidate: type eigenschap voor meer informatie over verschillende soorten Ice-kandidaten.

Momenteel ondersteunt de Android SDK slechts één IPv4-adres en UDP-protocol voor mediaproxy. Als er geen UDP-poort is opgegeven, wordt er een standaard UDP-poort 3478 gebruikt. De SDK genereert als volgt een Failed to set media proxy fout bij het aanroepen setIceServer met niet-ondersteunde invoer:

  • Er is meer dan één ICE-server beschikbaar in de lijst IceServers.
  • Er wordt meer dan één URL opgegeven in de URL-lijst van IceServer.
  • De IPv6-URL wordt opgegeven in de URL-lijst.
  • Er is alleen TCP-poort opgegeven.
  • Realm-informatie is niet opgegeven.

Als de verstrekte ICE-servergegevens ongeldig zijn, mislukt de CallClient initialisatie en genereert deze fouten dienovereenkomstig.

Een TURN-server instellen in Azure

U kunt een virtuele Linux-machine maken in Azure Portal. Zie quickstart: Een virtuele Linux-machine maken in Azure Portal voor meer informatie. Als u een TURN-server wilt implementeren, gebruikt u coturn. Coturn is een gratis en opensource-implementatie van een TURN- en STUN-server voor VoIP en WebRTC.

Nadat u een TURN-server hebt ingesteld, kunt u deze testen met behulp van de instructies op de WebRTC Trickle ICE-webpagina .

Proxysignaalverkeer

Als u de URL van een proxyserver wilt opgeven, moet u deze doorgeven als onderdeel van de eigenschap Network tijdens CallClientOptions het initialiserenCallClient. Zie Azure Communication Services Android SDK voor de quickstart over het instellen van spraak en video voor meer informatie over het instellen van een gesprek.

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.

Een signaleringsproxyserver instellen in Azure

U kunt een virtuele Linux-machine maken in Azure Portal en er een NGINX-server op implementeren. Zie quickstart: Een virtuele Linux-machine maken in Azure Portal voor meer informatie.

Hier volgt een NGINX-configuratie die u als voorbeeld kunt gebruiken:

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;
        }
    }
}

De proxyfunctie is niet beschikbaar voor Teams-identiteiten en Interoperabiliteitsacties van Azure Communication Services Teams.

Mediaverkeer via proxy aanroepen

In de volgende secties wordt beschreven hoe u uw mediaverkeer via proxy kunt aanroepen.

Wat is een TURN-server?

Vaak is het tot stand brengen van een netwerkverbinding tussen twee peers niet eenvoudig. Een directe verbinding werkt mogelijk niet vanwege:

  • Firewalls met strikte regels.
  • Peers die achter een particulier netwerk zitten.
  • Computers die worden uitgevoerd in een NAT-omgeving (Network Address Translation).

Als u deze problemen met de netwerkverbinding wilt oplossen, kunt u een server gebruiken die gebruikmaakt van het Traversal Using Relay NAT-protocol (TURN) voor het doorsturen van netwerkverkeer. Session Traversal Utilities for NAT (STUN) en TURN-servers zijn de relayservers.

Geef uw TURN-servergegevens op met de SDK

Als u de details van uw TURN-servers wilt opgeven, moet u details doorgeven over welke TURN-server moet worden gebruikt als onderdeel van CallClientOptions het initialiseren CallClient. Zie Voor meer informatie over het instellen van een gesprek Azure Communication Services Windows SDK voor de quickstart over het instellen van spraak en video.

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);

Belangrijk

Als u uw TURN-servergegevens hebt opgegeven tijdens het initialiseren CallClient, stroomt al het mediaverkeer uitsluitend via deze TURN-servers. Alle andere ICE-kandidaten die normaal gesproken worden gegenereerd wanneer u een oproep maakt, worden niet meegenomen bij het tot stand brengen van connectiviteit tussen peers. Dat betekent dat alleen relay kandidaten worden overwogen. Zie RTCIceCandidate: type eigenschap voor meer informatie over verschillende soorten Ice-kandidaten.

Momenteel ondersteunt de Android SDK slechts één IPv4-adres en UDP-protocol voor mediaproxy. Als er geen UDP-poort is opgegeven, wordt er een standaard UDP-poort 3478 gebruikt. De SDK genereert als volgt een Failed to set media proxy fout bij het aanroepen setIceServer met niet-ondersteunde invoer:

  • Er is meer dan één ICE-server beschikbaar in de lijst IceServers.
  • Er wordt meer dan één URL opgegeven in de URL-lijst van IceServer.
  • De IPv6-URL wordt opgegeven in de URL-lijst.
  • Er is alleen TCP-poort opgegeven.
  • Realm-informatie is niet opgegeven.

Als de verstrekte ICE-servergegevens ongeldig zijn, mislukt de CallClient initialisatie en genereert deze fouten dienovereenkomstig.

Een TURN-server instellen in Azure

U kunt een virtuele Linux-machine maken in Azure Portal. Zie quickstart: Een virtuele Linux-machine maken in Azure Portal voor meer informatie. Als u een TURN-server wilt implementeren, gebruikt u coturn. Coturn is een gratis en opensource-implementatie van een TURN- en STUN-server voor VoIP en WebRTC.

Nadat u een TURN-server hebt ingesteld, kunt u deze testen met behulp van de instructies op de WebRTC Trickle ICE-webpagina .

Proxysignaalverkeer

Als u de URL van een proxyserver wilt opgeven, moet u deze doorgeven als onderdeel van de eigenschap Network tijdens CallClientOptions het initialiserenCallClient. Zie Voor meer informatie over het instellen van een gesprek Azure Communication Services Windows SDK voor de quickstart over het instellen van spraak en video.

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.

Een signaleringsproxyserver instellen in Azure

U kunt een virtuele Linux-machine maken in Azure Portal en er een NGINX-server op implementeren. Zie quickstart: Een virtuele Linux-machine maken in Azure Portal voor meer informatie.

Hier volgt een NGINX-configuratie die u als voorbeeld kunt gebruiken:

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;
        }
    }
}