Audio-/Videoanrufe aus einer benutzerdefinierten App in eine Teams-Besprechung
Niveau: Fortgeschritten
In diesem Lernprogramm erfahren Sie, wie Azure Communication Services in einer benutzerdefinierten React-Anwendung verwendet werden kann, damit ein Benutzer einen Audio-/Videoanruf in eine Microsoft Teams-Besprechung tätigen kann. Sie erfahren mehr über die verschiedenen Bausteine, die verwendet werden können, um dieses Szenario zu ermöglichen und praktische Schritte zur Verfügung zu stellen, um Sie durch die verschiedenen beteiligten Microsoft Cloud-Dienste zu führen.
Was Sie in diesem Lernprogramm erstellen werden
Übersicht über die Anwendungslösung
Voraussetzungen
- Node LTS – Node LTS wird für dieses Projekt verwendet.
- git
- Visual Studio Code oder eine andere IDE Ihrer Wahl.
- Azure Functions-Erweiterung für VS-Code
- Azure Functions Core Tools
- Azure-Abonnement
- Microsoft 365-Entwicklermandant
- GitHub-Konto
- Visual Studio bei Verwendung der C#-Version des Lernprogramms. Visual Studio Code kann auch bei Bedarf verwendet werden.
Technologien, die in diesem Lernprogramm verwendet werden, umfassen
- React
- Azure Communication Services
- Azure-Funktionen
- Microsoft Graph
- Microsoft Teams
Erstellen einer Azure Communication Services-Ressource
In dieser Übung erstellen Sie eine Azure Communication Services (ACS)-Ressource im Azure-Portal.
Führen Sie zunächst die folgenden Aufgaben aus:
Besuchen Sie die Azure-Portal in Ihrem Browser, und melden Sie sich an.
Geben Sie Kommunikationsdienste in die Suchleiste oben auf der Seite ein, und wählen Sie "Kommunikationsdienste " aus den angezeigten Optionen aus.
Wählen Sie auf der Symbolleiste "Erstellen" aus.
Führen Sie die folgenden Aufgaben aus:
- Wählen Sie Ihr Azure-Abonnement.
- Wählen Sie die zu verwendende Ressourcengruppe aus (erstellen Sie eine neue Gruppe, wenn sie nicht vorhanden ist).
- Geben Sie einen ACS-Ressourcennamen ein. Der Name muss ein eindeutiger Wert sein.
- Wählen Sie einen Datenspeicherort aus.
Wählen Sie "Überprüfen" und "Erstellen" gefolgt von "Erstellen" aus.
Nachdem Ihre ACS-Ressource erstellt wurde, navigieren Sie zu dieser Ressource, und wählen Sie "Einstellungen "> – Identitäten und Benutzerzugriffstoken" aus.
Aktivieren Sie das Kontrollkästchen VoIP (Voice and Video Calling).
Wählen Sie Generieren aus.
Kopieren Sie die Identitäts- und Benutzerzugriffstokenwerte in eine lokale Datei. Sie benötigen die Werte später in dieser Übung.
Wählen Sie "Einstellungen" aus–> Schlüssel und kopieren Sie den Primärschlüssel Verbindungszeichenfolge Wert in die lokale Datei, in die Sie die Benutzeridentitäts- und Tokenwerte kopiert haben.
Zum Ausführen der Anwendung benötigen Sie einen Teams-Besprechungslink. Wechseln Sie zu Microsoft Teams, melden Sie sich mit Ihrem Microsoft 365-Entwicklermandanten an, und wählen Sie die Kalenderoption auf der linken Seite aus.
Tipp
Wenn Sie derzeit kein Microsoft 365-Konto besitzen, können Sie sich für das Microsoft 365-Entwicklerprogrammabonnement registrieren. Es ist für 90 Tage kostenlos und wird kontinuierlich verlängert, solange Sie sie für Entwicklungsaktivitäten verwenden. Wenn Sie über ein Visual Studio Enterprise- oder Professional-Abonnement verfügen, enthalten beide Programme ein kostenloses Microsoft 365-Entwicklerabonnement, das für die Lebensdauer Ihres Visual Studio-Abonnements aktiv ist.
Wählen Sie ein beliebiges Datum/eine beliebige Uhrzeit im Kalender aus, fügen Sie einen Titel für die Besprechung hinzu, laden Sie einen Benutzer aus Ihrem Microsoft 365-Entwicklermandanten ein, und wählen Sie "Speichern" aus.
Wählen Sie die neue Besprechung aus, die Sie im Kalender hinzugefügt haben, und kopieren Sie den Teams-Besprechungslink, der in derselben Datei angezeigt wird, in der Sie die ACS-Benutzeridentität, das Token und Verbindungszeichenfolge gespeichert haben.
Nachdem Ihre ACS-Ressource eingerichtet ist und Sie über einen Link zum Teilnehmen an einer Teams-Besprechung verfügen, lassen Sie uns die React-Anwendung starten und ausführen.
Integrieren von Azure Communication Services Calling in eine React-App
In dieser Übung fügen Sie die ACS-UI-Aufrufe einer React-App hinzu , um Audio-/Videoanrufe aus einer benutzerdefinierten App in einer Microsoft Teams-Besprechung zu ermöglichen.
Besuchen Sie GitHub, und melden Sie sich an. Wenn Sie noch nicht über ein GitHub-Konto verfügen, können Sie die Option "Registrieren " auswählen, um ein Konto zu erstellen.
Besuchen Sie das Microsoft Cloud GitHub-Repository.
Wählen Sie die Option "Verzweigung " aus, um das Repository zu Ihrer gewünschten GitHub-Organisation/Ihrem gewünschten Konto hinzuzufügen.
Führen Sie den folgenden Befehl aus, um dieses Repository auf Ihrem Computer zu klonen. Ersetzen Sie <YOUR_ORG_NAME> durch Ihren GitHub-Organisations-/Kontonamen.
git clone https://github.com/<YOUR_ORG_NAME>/MicrosoftCloud
Öffnen Sie den Projektordner "Samples/acs-to-teams-meeting " in Visual Studio Code.
Erweitern Sie den Client-/React-Ordner .
Öffnen Sie die package.json Datei in VS Code, und beachten Sie, dass die folgenden ACS-Pakete enthalten sind:
@azure/communication-common @azure/communication-react
Überprüfen Sie, ob npm 10 oder höher installiert ist, indem Sie ein Terminalfenster öffnen und den folgenden Befehl ausführen:
npm --version
Tipp
Wenn Sie npm 10 oder höher nicht installiert haben, können Sie npm auf die neueste Version aktualisieren, indem Sie diese ausführen
npm install -g npm
.Öffnen Sie ein Terminalfenster, und führen Sie den
npm install
Befehl im React-Ordner aus, um die Anwendungsabhängigkeiten zu installieren.Öffnen Sie App.tsx , und nehmen Sie sich einen Moment Zeit, um die Importe am Anfang der Datei zu erkunden. Diese behandeln das Importieren von ACS-Sicherheits- und Audio-/Videoanrufsymbolen, die in der App verwendet werden.
import { AzureCommunicationTokenCredential, CommunicationUserIdentifier } from '@azure/communication-common'; import { CallComposite, fromFlatCommunicationIdentifier, useAzureCommunicationCallAdapter } from '@azure/communication-react'; import React, { useState, useMemo, useEffect } from 'react'; import './App.css';
Hinweis
Sie sehen, wie die
CallComposite
Komponente später in dieser Übung verwendet wird. Sie bietet die hauptfunktionen der Benutzeroberfläche für Azure Communication Services, um einen Audio-/Videoanruf aus der App in eine Microsoft Teams-Besprechung zu ermöglichen.Suchen Sie die
App
Komponente, und führen Sie die folgenden Aufgaben aus:- Nehmen Sie sich einen Moment Zeit, um die
useState
Definitionen in der Komponente zu untersuchen. - Ersetzen Sie die leeren Anführungszeichen der
userId
useState
Funktion durch den ACS-Benutzeridentitätswert, den Sie in der vorherigen Übung kopiert haben. - Ersetzen Sie die leeren Anführungszeichen der
token
useState
Funktion durch den ACS-Tokenwert, den Sie in der vorherigen Übung kopiert haben. - Ersetzen Sie die leeren Anführungszeichen der
teamsMeetingLink
useState
Funktion durch den Wert des Teams-Besprechungslinks, den Sie in der vorherigen Übung kopiert haben.
// Replace '' with the ACS user identity value const [userId, setUserId] = useState<string>(''); // Replace '' with the ACS token value const [token, setToken] = useState<string>(''); // Replace '' with the Teams meeting link value const [teamsMeetingLink, setTeamsMeetingLink] = useState<string>('');
Hinweis
Später in diesem Lernprogramm erfahren Sie, wie Sie die
userId
Wertetoken
dynamisch abrufen.teamsMeetingLink
- Nehmen Sie sich einen Moment Zeit, um die
Nehmen Sie sich einen Moment Zeit, um die
useMemo
Funktionen in derApp
Komponente zu erkunden.- Die
credential
useMemo
Funktion erstellt eine neueAzureCommunicationTokenCredential
Instanz, sobald das Token einen Wert aufweist. - Die
callAdapterArgs
useMemo
Funktion gibt ein Objekt zurück, das die Argumente enthält, die zum Tätigen eines Audio-/Videoanrufs verwendet werden. Beachten Sie, dass dieuserId
credential
AcS-Aufrufargumente undteamsMeetingLink
Werte verwendet werden.
const credential = useMemo(() => { if (token) { return new AzureCommunicationTokenCredential(token) } return; }, [token]); const callAdapterArgs = useMemo(() => { if (userId && credential && displayName && teamsMeetingLink) { return { userId: fromFlatCommunicationIdentifier(userId) as CommunicationUserIdentifier, displayName, credential, locator: { meetingLink: teamsMeetingLink }, } } return {}; }, [userId, credential, displayName, teamsMeetingLink]);
Hinweis
useMemo
wird in diesem Szenario verwendet, da das Objekt und die Aufrufadapterargumente nurAzureCommunicationTokenCredential
einmal erstellt werden sollen, wenn die erforderlichen Parameter übergeben werden. Weitere Details zu useMemo finden Sie hier.- Die
Sobald sie
credentials
fertig sind,callAdapterArgs
behandelt die folgende Zeile das Erstellen eines ACS-Anrufadapters mithilfe des react-Hooks, deruseAzureCommunicationCallAdapter
von ACS bereitgestellt wird. DascallAdapter
Objekt wird später in der Benutzeroberfläche verwendet, die die zusammengesetzte Komponente aufruft.const callAdapter = useAzureCommunicationCallAdapter(callAdapterArgs);
Hinweis
Da
useAzureCommunicationCallAdapter
es sich um einen React-Hook handelt, wird erst dann ein Wert zugewiesencallAdapter
, wenn dercallAdapterArgs
Wert gültig ist.Zuvor haben Sie der Benutzeridentität, dem Token und dem Teams-Besprechungslink Statuswerte in der
App
Komponente zugewiesen. Das funktioniert jetzt gut, aber in einer späteren Übung erfahren Sie, wie Sie diese Werte dynamisch abrufen können. Da Sie die Werte zuvor festgelegt haben, kommentieren Sie den Code in deruseEffect
Funktion wie folgt aus. Nachdem Sie die Azure-Funktionen in den nächsten Übungen ausgeführt haben, überprüfen Sie diesen Code erneut.useEffect(() => { /* Commenting out for now const init = async () => { setMessage('Getting ACS user'); //Call Azure Function to get the ACS user identity and token let res = await fetch(process.env.REACT_APP_ACS_USER_FUNCTION as string); let user = await res.json(); setUserId(user.userId); setToken(user.token); setMessage('Getting Teams meeting link...'); //Call Azure Function to get the meeting link res = await fetch(process.env.REACT_APP_TEAMS_MEETING_FUNCTION as string); let link = await res.text(); setTeamsMeetingLink(link); setMessage(''); console.log('Teams meeting link', link); } init(); */ }, []);
Suchen Sie den folgenden JSX-Code. Es verwendet das Symbol, das
CallComposite
Sie importiert haben, um die Benutzeroberfläche zu rendern, die verwendet wird, um einen Audio-/Videoanruf aus der React-App in eine Teams-Besprechung zu tätigen. DiecallAdapter
zuvor beschriebene Eigenschaft wird an die Eigenschaft übergebenadapter
, um die erforderlichen Argumente bereitzustellen.if (callAdapter) { return ( <div> <h1>Contact Customer Service</h1> <div className="wrapper"> <CallComposite adapter={callAdapter} /> </div> </div> ); }
Speichern Sie die Datei, bevor Sie fortfahren.
Führen Sie
npm start
das Terminalfenster aus, um die Anwendung auszuführen. Stellen Sie sicher, dass Sie den Befehl im React-Ordner ausführen.Nachdem die Anwendungen erstellt wurden, sollte eine aufrufende Benutzeroberfläche angezeigt werden. Aktivieren Sie die Auswahl Ihres Mikrofons und der Kamera, und initiieren Sie den Anruf. Sie sollten sehen, dass Sie sich in einem Warteraum befinden. Wenn Sie an der Zuvor in Microsoft Teams eingerichteten Besprechung teilnehmen, können Sie dem Gast die Teilnahme an der Besprechung gestatten.
Drücken Sie STRG+C , um die Anwendung zu beenden. Nachdem Sie es nun erfolgreich ausgeführt haben, erfahren Sie, wie Sie die ACS-Benutzeridentität und das AcS-Benutzertoken dynamisch abrufen und automatisch eine Microsoft Teams-Besprechung erstellen und die Teilnahme-URL mithilfe von Microsoft Graph zurückgeben können.
Dynamisches Erstellen einer Microsoft Teams-Besprechung mit Microsoft Graph
In dieser Übung automatisieren Sie den Prozess des Erstellens eines Microsoft Teams-Besprechungslinks und übergeben den ACS mithilfe von Azure Functions und Microsoft Graph.
Sie müssen eine Microsoft Entra-ID-App für die Daemon-App-Authentifizierung erstellen. In diesem Schritt wird die Authentifizierung im Hintergrund mit App-Anmeldeinformationen behandelt, und eine Microsoft Entra-ID-App verwendet Anwendungsberechtigungen, um Microsoft Graph-API-Aufrufe auszuführen. Microsoft Graph wird verwendet, um dynamisch eine Microsoft Teams-Besprechung zu erstellen und die Teams-Besprechungs-URL zurückzugeben.
Führen Sie die folgenden Schritte aus, um eine Microsoft Entra ID-App zu erstellen:
- Wechseln Sie zu Azure-Portal, und wählen Sie "Microsoft Entra-ID" aus.
- Wählen Sie die Registerkarte "App-Registrierung " gefolgt von +Neue Registrierung aus.
- Füllen Sie die Details des neuen App-Registrierungsformulars aus, wie unten dargestellt, und wählen Sie "Registrieren" aus:
- Name: ACS Teams Interop-App
- Unterstützte Kontotypen: Konten in jedem Organisationsverzeichnis (beliebiges Microsoft Entra ID-Verzeichnis – Multitenant) und persönliche Microsoft-Konten (z. B. Skype, Xbox)
- Umleitungs-URI: Lassen Sie diesen Wert leer.
- Wechseln Sie nach der Registrierung der App zu API-Berechtigungen , und wählen Sie +Berechtigung hinzufügen aus.
- Wählen Sie Microsoft Graph gefolgt von Anwendungsberechtigungen aus.
- Wählen Sie die
Calendars.ReadWrite
Berechtigung und dann "Hinzufügen" aus. - Nachdem Sie die Berechtigungen hinzugefügt haben, wählen Sie " Administratorzustimmung für <YOUR_ORGANIZATION_NAME> erteilen" aus.
- Wechseln Sie zur Registerkarte "Zertifikate und geheime Schlüssel ", wählen Sie "+Neuer geheimer Clientschlüssel" und dann " Hinzufügen" aus.
- Kopieren Sie den Wert des geheimen Schlüssels in eine lokale Datei. Sie verwenden den Wert später in dieser Übung.
- Wechseln Sie zur Registerkarte "Übersicht ", und kopieren Sie die
Application (client) ID
Werte inDirectory (tenant) ID
dieselbe lokale Datei, die Sie im vorherigen Schritt verwendet haben.
Erstellen einer local.settings.json Datei
Öffnen Sie den
samples/acs-to-teams-meeting/server/csharp/GraphACSFunctions.sln
Ordner "GraphACSFunctions" in Visual Studio Code, oder öffnen Sie den Ordner "GraphACSFunctions ".Wechseln Sie zum
GraphACSFunctions
Projekt, und erstellen Sie einelocal.settings.json
Datei mit den folgenden Werten:{ "IsEncrypted": false, "Values": { "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", "TENANT_ID": "", "CLIENT_ID": "", "CLIENT_SECRET": "", "USER_ID": "", "ACS_CONNECTION_STRING": "" }, "Host": { "LocalHttpPort": 7071, "CORS": "*", "CORSCredentials": false }, "watchDirectories": [ "Shared" ] }
- Verwenden Sie die Werte, die Sie in die lokale Datei in einer früheren Übung kopiert haben, um die Werte
CLIENT_ID
undCLIENT_SECRET
WerteTENANT_ID
zu aktualisieren. - Definieren Sie
USER_ID
mit der Benutzer-ID, die Sie erstellen möchten, eine Microsoft Teams-Besprechung.
Sie können die Benutzer-ID aus dem Azure-Portal abrufen.
- Melden Sie sich mit Ihrem Microsoft 365-Entwicklermandantenadministratorkonto an.
- Wählen Sie Microsoft Entra ID aus.
- Navigieren Sie zur Registerkarte "Benutzer " auf der Seitenleiste.
- Suchen Sie nach Ihrem Benutzernamen, und wählen Sie ihn aus, um die Benutzerdetails anzuzeigen.
- Innerhalb der Benutzerdetails
Object ID
stellt dieUser ID
. Kopieren Sie denObject ID
Wert, und verwenden Sie ihn für denUSER_ID
Wert in local.settings.json.
Hinweis
ACS_CONNECTION_STRING
wird in der nächsten Übung verwendet, damit Sie sie noch nicht aktualisieren müssen.- Verwenden Sie die Werte, die Sie in die lokale Datei in einer früheren Übung kopiert haben, um die Werte
Öffnen Sie
GraphACSFunctions.sln
sich im Ordner acs-to-teams-meeting/server/csharp , und beachten Sie, dass sie die folgenden Microsoft Graph- und Identitätspakete enthält:<PackageReference Include="Azure.Communication.Identity" Version="1.3.1" /> <PackageReference Include="Azure.Identity" Version="1.11.2" /> <PackageReference Include="Microsoft.Graph" Version="5.51.0" />
Wechseln Sie zu Program.cs , und notieren Sie sich den folgenden Code in der
ConfigureServices
Methode:var host = new HostBuilder() .ConfigureFunctionsWebApplication() .ConfigureServices(services => { services.AddApplicationInsightsTelemetryWorkerService(); services.ConfigureFunctionsApplicationInsights(); services.AddSingleton(static p => { var config = p.GetRequiredService<IConfiguration>(); var clientSecretCredential = new ClientSecretCredential( config.GetValue<string>("TENANT_ID"), config.GetValue<string>("CLIENT_ID"), config.GetValue<string>("CLIENT_SECRET") ); return new GraphServiceClient( clientSecretCredential, ["https://graph.microsoft.com/.default"] ); }); ... services.AddSingleton<IGraphService, GraphService>(); }) .Build(); }
- Dieser Code erstellt ein
GraphServiceClient
Objekt, das zum Aufrufen von Microsoft Graph aus Azure Functions verwendet werden kann. Es ist ein Singleton und kann in andere Klassen eingefügt werden. - Sie können Microsoft Graph-API-Aufrufe mit Nur-App-Berechtigungen (z . B. Calendars.ReadWrite) ausführen, indem Sie einen
ClientSecretCredential
Wert an denGraphServiceClient
Konstruktor übergeben. DiesClientSecretCredential
verwendet dieTenant Id
WerteClient Id
undClient Secret
Werte aus der Microsoft Entra ID-App.
- Dieser Code erstellt ein
Öffnen Sie Dienste/GraphService.cs.
Nehmen Sie sich einen Moment Zeit, um die
CreateMeetingEventAsync
Methode zu erkunden:using System; using System.Threading.Tasks; using Microsoft.Graph; using Microsoft.Extensions.Configuration; namespace GraphACSFunctions.Services; public class GraphService : IGraphService { private readonly GraphServiceClient _graphServiceClient; private readonly IConfiguration _configuration; public GraphService(GraphServiceClient graphServiceClient, IConfiguration configuration) { _graphServiceClient = graphServiceClient; _configuration = configuration; } public async Task<string> CreateMeetingAsync() { var userId = _configuration.GetValue<string>("USER_ID"); var newMeeting = await _graphServiceClient .Users[userId] .Calendar .Events .PostAsync(new() { Subject = "Customer Service Meeting", Start = new() { DateTime = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss"), TimeZone = "UTC" }, End = new() { DateTime = DateTime.UtcNow.AddHours(1).ToString("yyyy-MM-ddTHH:mm:ss"), TimeZone = "UTC" }, IsOnlineMeeting = true }); return newMeeting.OnlineMeeting.JoinUrl; } }
GraphServiceClient
undIConfiguration
Objekte werden in den Konstruktor eingefügt und Feldern zugewiesen.- Die
CreateMeetingAsync()
Funktion sendet Daten an die Microsoft Graph-Kalenderereignisse-API, die dynamisch ein Ereignis im Kalender eines Benutzers erstellt und die Verknüpfungs-URL zurückgibt.
Öffnen Sie TeamsMeetingFunctions.cs, und nehmen Sie sich einen Moment Zeit, um den Konstruktor zu untersuchen. Die
GraphServiceClient
zuvor angesehene Datei wird eingefügt und dem_graphService
Feld zugewiesen.private readonly IGraphService _graphService; public TeamsMeetingFunction(IGraphService graphService) => _graphService = graphService;
Suchen Sie die
Run
Methode:[Function("HttpTriggerTeamsUrl")] public async Task<HttpResponseData> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequestData req, ILogger log) { var response = req.CreateResponse(HttpStatusCode.OK); await response.WriteStringAsync(await _graphService.CreateMeetingAsync()); return response; }
- Er definiert einen Funktionsnamen, der
HttpTriggerTeamsUrl
mit einer HTTP GET-Anforderung aufgerufen werden kann. - Es ruft ein neues Ereignis auf
_graphService.CreateMeetingAsync()
und gibt die Join-URL zurück.
- Er definiert einen Funktionsnamen, der
Führen Sie das Programm aus, indem Sie in Visual Studio F5 drücken oder "Debuggen" auswählen .> Starten Sie das Debuggen über das Menü. Diese Aktion startet das Azure Functions-Projekt und stellt den
ACSTokenFunction
Aufruf zur Verfügung.
Hinweis
Wenn Sie VS Code verwenden, können Sie ein Terminalfenster im Ordner "GraphACSFunctions " öffnen und ausführen func start
. Dabei wird davon ausgegangen, dass die Azure Functions Core Tools auf Ihrem Computer installiert sind.
Aufrufen der Azure-Funktion aus React
Nachdem die
httpTriggerTeamsUrl
Funktion nun einsatzbereit ist, rufen wir sie aus der React-App auf.Erweitern Sie den Client-/React-Ordner .
Fügen Sie dem Ordner eine env-Datei mit den folgenden Werten hinzu:
REACT_APP_TEAMS_MEETING_FUNCTION=http://localhost:7071/api/httpTriggerTeamsUrl REACT_APP_ACS_USER_FUNCTION=http://localhost:7071/api/httpTriggerAcsToken
Diese Werte werden während der Builderstellung an React übergeben, sodass Sie sie während des Buildprozesses ganz einfach ändern können.
Öffnen Sie die Datei "client/react/App.tsx " in VS Code.
Suchen Sie die
teamsMeetingLink
Statusvariable in der Komponente. Entfernen Sie den hartcodierten Teams-Link, und ersetzen Sie ihn durch leere Anführungszeichen:const [teamsMeetingLink, setTeamsMeetingLink] = useState<string>('');
Suchen Sie die
useEffect
Funktion, und ändern Sie sie so, dass sie wie folgt aussieht. Dadurch wird das Aufrufen der Azure-Funktion behandelt, die Sie zuvor betrachtet haben, wodurch eine Teams-Besprechung erstellt wird und der Link zum Teilnehmen an der Besprechung zurückgegeben wird:useEffect(() => { const init = async () => { /* Commenting out for now setMessage('Getting ACS user'); //Call Azure Function to get the ACS user identity and token const res = await fetch(process.env.REACT_APP_ACS_USER_FUNCTION as string); const user = await res.json(); setUserId(user.userId); setToken(user.token); */ setMessage('Getting Teams meeting link...'); //Call Azure Function to get the meeting link const resTeams = await fetch(process.env.REACT_APP_TEAMS_MEETING_FUNCTION as string); const link = await resTeams.text(); setTeamsMeetingLink(link); setMessage(''); console.log('Teams meeting link', link); } init(); }, []);
Speichern Sie die Datei, bevor Sie fortfahren.
Öffnen Sie ein Terminalfenster,
cd
in den Ordner *react, und führen Sie sie ausnpm start
, um die Anwendung zu erstellen und auszuführen.Nachdem die Anwendung erstellt und geladen wurde, sollte die ACS-aufrufende Benutzeroberfläche angezeigt werden und sich dann in die Teams-Besprechung einwählen, die dynamisch von Microsoft Graph erstellt wurde.
Beenden Sie den Terminalprozess, indem Sie STRG+C in das Terminalfenster eingeben.
Beenden Sie das Azure Functions-Projekt.
Hinweis
Besuchen Sie die Dokumentation zu Azure Communication Services, um mehr über das Erweitern von Microsoft Teams-Besprechungen auf andere Weise zu erfahren.
Dynamisches Erstellen einer Azure Communication Services-Identität und eines Tokens
In dieser Übung erfahren Sie, wie Sie Benutzeridentitäts- und Tokenwerte mithilfe von Azure Functions dynamisch aus Azure Communication Services abrufen. Nach dem Abrufen werden die Werte an die ACS UI composite übergeben, um einen Aufruf eines Kunden zu ermöglichen.
Öffnen Sie local.settings.json, und aktualisieren Sie den
ACS_CONNECTION_STRING
Wert mit der ACS-Verbindungszeichenfolge, die Sie in einer früheren Übung gespeichert haben.Öffnen Sie Startup.cs in Visual Studio, und erkunden Sie den zweiten
AddSingleton()
Aufruf in derConfigureServices()
Methode.var host = new HostBuilder() .ConfigureFunctionsWebApplication() .ConfigureServices(services => { ... services.AddSingleton(static p => { var config = p.GetRequiredService<IConfiguration>(); var connectionString = config.GetValue<string>("ACS_CONNECTION_STRING"); return new CommunicationIdentityClient(connectionString); }); ... }) .Build(); }
Der
AddSingleton()
Aufruf erstellt einCommunicationIdentityClient
Objekt mithilfe desACS_CONNECTION_STRING
Werts aus local.settings.json.Öffnen Sie ACSTokenFunction.cs , und suchen Sie die Konstruktor- und Felddefinitionen.
Ein benanntes
Scopes
Feld ist definiert, das denCommunicationTokenScope.VoIP
Bereich enthält. Dieser Bereich wird verwendet, um das Zugriffstoken für den Videoanruf zu erstellen.private static readonly CommunicationTokenScope[] Scopes = [ CommunicationTokenScope.VoIP, ];
Die
CommunicationIdentityClient
in Startup.cs erstellte Singletoninstanz wird in den Konstruktor eingefügt und dem_tokenClient
Feld zugewiesen.private readonly CommunicationIdentityClient _tokenClient; public ACSTokenFunction(CommunicationIdentityClient tokenClient) { _tokenClient = tokenClient; }
Erkunden Sie die
Run()
Methode in ACSTokenFunction.cs:[Function("HttpTriggerAcsToken")] public async Task<HttpResponseData> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequestData req, ILogger log) { var user = await _tokenClient.CreateUserAsync(); var userToken = await _tokenClient.GetTokenAsync(user, Scopes); var response = req.CreateResponse(HttpStatusCode.OK); await response.WriteAsJsonAsync( new { userId = user.Value.Id, userToken.Value.Token, userToken.Value.ExpiresOn } ); return response; }
- Sie definiert eine Funktion, die
HttpTriggerAcsToken
mit einer HTTP GET-Anforderung aufgerufen werden kann. - Ein neuer ACS-Benutzer wird durch Aufrufen der
_tokenClient.CreateUserAsync()
Methode erstellt. - Ein Zugriffstoken, das für Videoaufrufe verwendet wird, wird durch Aufrufen der
_tokenClient. GetTokenAsync()
Methode erstellt. - Die Benutzer-ID und das Token werden von der Funktion als JSON-Objekt zurückgegeben.
- Sie definiert eine Funktion, die
Führen Sie das Programm aus, indem Sie in Visual Studio F5 drücken oder "Debuggen" auswählen .> Starten Sie das Debuggen über das Menü. Dadurch wird das Azure Functions-Projekt gestartet und zum
ACSTokenFunction
Aufrufen zur Verfügung gestellt.Hinweis
Wenn Sie VS Code verwenden, können Sie ein Terminalfenster im Ordner "GraphACSFunctions " öffnen und ausführen
func start
. Dabei wird davon ausgegangen, dass die Azure Functions Core Tools auf Ihrem Computer installiert sind.Nachdem die Azure-Funktionen lokal ausgeführt werden, muss der Client sie aufrufen können, um die ACS-Benutzeridentitäts- und Tokenwerte abzurufen.
Öffnen Sie Beispiele/acs-to-teams-meeting/client/react/App.tsx Datei in Ihrem Editor.
Suchen Sie die
userId
Variablen undtoken
Zustandsvariablen in der Komponente. Entfernen Sie die hartcodierten Werte, und ersetzen Sie sie durch leere Anführungszeichen:const [userId, setUserId] = useState<string>(''); const [token, setToken] = useState<string>('');
Suchen Sie die
useEffect
Funktion, und ändern Sie sie so, dass sie wie folgt aussieht, um das Aufrufen der Azure-Funktion zum Abrufen einer ACS-Benutzeridentität und eines Tokens zu ermöglichen:useEffect(() => { const init = async () => { setMessage('Getting ACS user'); //Call Azure Function to get the ACS user identity and token let res = await fetch(process.env.REACT_APP_ACS_USER_FUNCTION as string); let user = await res.json(); setUserId(user.userId); setToken(user.token); setMessage('Getting Teams meeting link...'); //Call Azure Function to get the meeting link res = await fetch(process.env.REACT_APP_TEAMS_MEETING_FUNCTION as string); let link = await res.text(); setTeamsMeetingLink(link); setMessage(''); console.log('Teams meeting link', link); } init(); }, []);
Speichern Sie die Datei, bevor Sie fortfahren.
Öffnen Sie ein Terminalfenster, und führen Sie es
react
im Ordner ausnpm start
. Nach dem Erstellen und Laden sollte die ACS-Aufrufbenutzeroberfläche angezeigt werden, und Sie können sich in die Teams-Besprechung einwählen, die dynamisch von Microsoft Graph erstellt wurde.Beenden Sie die React-App, indem Sie STRG+C im Terminalfenster drücken.
Beenden Sie das Azure Functions-Projekt.
Übernehmen Sie Ihre Git-Änderungen, und übertragen Sie sie mithilfe von Visual Studio Code an Ihr GitHub-Repository:
- Wählen Sie das Quellcodeverwaltungssymbol aus (3. unten in der Visual Studio Code-Symbolleiste).
- Geben Sie eine Commit-Nachricht ein, und wählen Sie "Commit ausführen" aus.
- Wählen Sie " Änderungen synchronisieren" aus.
Bereitstellen der App für Azure-Funktionen und Azure-Container-Apps
Wichtig
Zusätzlich zu den voraussetzungen, die für dieses Lernprogramm aufgeführt sind, müssen Sie auch die folgenden Tools auf Ihrem Computer installieren, um diese Übung abzuschließen.
- Azure-Befehlszeilenschnittstelle
- Wenn Sie VS Code verwenden, installieren Sie die Azure Functions-Erweiterung
In dieser Übung erfahren Sie, wie Sie die in früheren Übungen beschriebenen Microsoft Graph- und ACS-Funktionen in Azure Functions bereitstellen. Sie erstellen auch ein Containerimage und stellen es in Azure-Container-Apps bereit.
Bereitstellen in Azure Functions
Hinweis
In diesem Abschnitt wird Visual Studio verwendet, um die C#-Funktionen in Azure zu veröffentlichen. Wenn Sie Visual Studio Code verwenden möchten, können Sie die Anweisungen in der Schnellstartanleitung zum Erstellen einer C#-Funktion in Azure mithilfe von Visual Studio Code befolgen.
Öffnen Sie das
samples/acs-video-to-teams-meeting/server/csharp/GraphACSFunctions.sln
Projekt in Visual Studio.Klicken Sie mit der rechten Maustaste auf das
GraphACSFunctions
Projekt, und wählen Sie "Veröffentlichen" aus.Wählen Sie Azure im Zielabschnitt aus, und klicken Sie dann auf "Weiter".
Wählen Sie die Azure-Funktions-App (Windows) aus, und klicken Sie dann auf "Weiter".
Wählen Sie Ihr Abonnement und dann +Neu erstellen aus.
Geben Sie die folgenden Informationen ein:
- Funktionsname: Ein global eindeutiger Name ist erforderlich. Beispiel: acsFunctions<YOUR_LAST_NAME>.
- Abonnement: Wählen Sie Ihr Abonnement aus.
- Ressourcengruppe: Wählen Sie eine Ressourcengruppe aus, die Sie zuvor in diesem Lernprogramm erstellt haben, oder Sie können auch eine neue erstellen.
- Hostingplan: Verbrauchsplan.
- Standort: Wählen Sie die Region aus, für die Sie bereitstellen möchten.
- Azure Storage: Erstellen Sie eine neue. (Sie können auch ein vorhandenes Speicherkonto auswählen.)
- Azure Insights: Erstellen Sie eine neue. (Sie können auch ein vorhandenes Speicherkonto auswählen.)
Hinweis
Ein global eindeutiger Name ist erforderlich. Sie können den Namen eindeutiger machen, indem Sie eine Zahl oder Ihren Nachnamen am Ende des Namens hinzufügen.
Nachdem die Azure-Funktions-App erstellt wurde, wird ein Bestätigungsbildschirm angezeigt. Stellen Sie sicher, dass die Option "Aus Paket ausführen" ausgewählt ist, und wählen Sie dann "Fertig stellen" aus.
Wählen Sie " Veröffentlichen" aus, um die Funktion in Azure bereitzustellen.
Nachdem die Funktion in Azure bereitgestellt wurde, wechseln Sie zum Azure-Portal, und wählen Sie die erstellte Funktions-App aus.
Kopieren Sie die URL für die bereitgestellte Funktion. Sie verwenden den Wert später in dieser Übung.
Wählen Sie "Einstellungen" aus –> Konfiguration im linken Menü.
Wählen Sie die Schaltfläche "+Neue Anwendungseinstellung " aus, und fügen Sie die folgenden Schlüssel und Werte in den Anwendungseinstellungen hinzu. Sie können diese Werte aus
local.settings.json
demGraphACSFunctions
Projekt wiederverwendung.# Retrieve these values from local.settings.json TENANT_ID: <YOUR_VALUE> CLIENT_ID: <YOUR_VALUE> CLIENT_SECRET: <YOUR_VALUE> USER_ID: <YOUR_VALUE> ACS_CONNECTION_STRING: <YOUR_VALUE>
Wählen Sie die Schaltfläche "Speichern " aus, um die Einstellungen zu speichern.
Schließlich müssen Sie CORS (Cross-Origin Resource Sharing) für die Funktions-App aktivieren, um die APIs der Funktions-App von außerhalb Ihrer Domäne zugänglich zu machen. Wählen Sie "Einstellungen" aus –> CORS im linken Menü.
Geben Sie
*
im Textfeld "Zulässige Ursprünge" (über beliebige Domänen zugänglich) die Schaltfläche "Speichern" ein.
Bereitstellen von Azure Container Apps
Die erste Aufgabe, die Sie ausführen, besteht darin, eine neue Azure Container Registry (ACR) -Ressource zu erstellen. Nachdem die Registrierung erstellt wurde, erstellen Sie ein Image und übertragen es an die Registrierung.
Öffnen Sie ein Befehlsfenster, und führen Sie den folgenden Befehl aus, um sich bei Ihrem Azure-Abonnement anzumelden:
az login
Fügen Sie die folgenden Shellvariablen hinzu, die Die Werte für die Platzhalter nach Bedarf ersetzen. Fügen Sie Ihre <GITHUB_USERNAME> als Kleinbuchstaben hinzu, und ersetzen Sie Ihre Azure Functions-Domäne durch den <AZURE_FUNCTIONS_DOMAIN> Wert (schließen Sie den
https://
Domänenwert ein).GITHUB_USERNAME="<YOUR_GITHUB_USERNAME>" RESOURCE_GROUP="<YOUR_RESOURCE_GROUP_NAME>" ACR_NAME="aca"$GITHUB_USERNAME AZURE_FUNCTIONS_DOMAIN="<YOUR_AZURE_FUNCTIONS_URL>"
Erstellen Sie eine neue Azure Container Registry-Ressource , indem Sie den folgenden Befehl ausführen:
az acr create \ --resource-group $RESOURCE_GROUP \ --name $ACR_NAME \ --sku Basic \ --admin-enabled true
Öffnen Sie die Datei "client/react/Dockerfile " in Ihrem Editor, und beachten Sie, dass die folgenden Aufgaben ausgeführt werden:
- Die React-Anwendung wird erstellt und der Buildphase zugewiesen.
- Der nginx-Server ist konfiguriert, und die Ausgabe der Buildstufe wird in das nginx-Serverimage kopiert.
Erstellen Sie das Containerimage in Azure, indem Sie den folgenden Befehl aus dem Stammordner des Client-/React-Ordners ausführen. Ersetzen Sie <YOUR_FUNCTIONS_DOMAIN> durch Ihre Azure Functions-Domäne, die Sie weiter oben in diese Übung in eine lokale Datei kopiert haben.
az acr build --registry $ACR_NAME --image acs-to-teams-meeting \ --build-arg REACT_APP_ACS_USER_FUNCTION=$AZURE_FUNCTIONS_DOMAIN/api/httpTriggerAcsToken \ --build-arg REACT_APP_TEAMS_MEETING_FUNCTION=$AZURE_FUNCTIONS_DOMAIN/api/httpTriggerTeamsUrl .
Führen Sie den folgenden Befehl aus, um die Bilder in Ihrer Registrierung auflisten zu können. Ihr neues Bild sollte aufgelistet werden.
az acr repository list --name $ACR_NAME --output table
Nachdem das Image bereitgestellt wurde, müssen Sie eine Azure-Container-App erstellen, die den Container ausführen kann.
Besuchen Sie die Azure-Portal in Ihrem Browser, und melden Sie sich an.
Geben Sie Container-Apps in der oberen Suchleiste ein, und wählen Sie "Container-Apps " aus den angezeigten Optionen aus.
Wählen Sie auf der Symbolleiste "Erstellen" aus.
Hinweis
Obwohl Sie das Azure-Portal verwenden, kann eine Container-App auch mithilfe der Azure CLI erstellt werden. Weitere Informationen finden Sie unter Schnellstart: Bereitstellen Ihrer ersten Container-App. Sie sehen ein Beispiel dafür, wie die Azure CLI am Ende dieser Übung verwendet werden kann.
Führen Sie die folgenden Aufgaben aus:
- Wählen Sie Ihr Abonnement aus.
- Wählen Sie die zu verwendende Ressourcengruppe aus (erstellen Sie bei Bedarf eine neue Gruppe). Sie können dieselbe Ressourcengruppe verwenden, die Sie für Ihre ACS-Ressource verwendet haben, wenn Sie möchten. Kopieren Sie ihren Ressourcengruppennamen in dieselbe lokale Datei, in der Sie Ihre Azure Functions-Domäne gespeichert haben.
- Geben Sie einen Container-App-Namen von acs-to-teams-meeting ein.
- Wählen Sie eine Region aus.
- Wählen Sie "Neu erstellen" im Abschnitt "Container-Apps-Umgebung" aus.
- Geben Sie einen Umgebungsnamen von acs-to-teams-meeting-env ein.
- Wählen Sie die Schaltfläche Erstellen.
- Wählen Sie "Weiter" aus: App-Einstellungen >.
Geben Sie die folgenden Werte im Bildschirm "Container-App erstellen" ein:
- Deaktivieren Sie das Kontrollkästchen "Schnellstartbild verwenden".
- Name: acs-to-teams-meeting
- Bildquelle: Azure Container Registry
- Registrierung: <YOUR_ACR_REGISTRY_NAME.azurecr.io>
- Bild: acs-to-teams-meeting
- Bild-Tag: neueste
- CPU und Arbeitsspeicher: 0,25 CPU-Kerne, -.5 Gi Arbeitsspeicher
Gehen Sie im Abschnitt "Anwendungseingangseinstellungen " wie folgt vor:
- Aktivieren Sie das Kontrollkästchen Aktiviert.
- Wählen Sie das Optionsfeld "Datenverkehr annehmen" aus .
Dadurch wird ein Einstiegspunkt (Ingress) für Ihre React-Anwendung erstellt und ermöglicht es, von überall aus aufgerufen zu werden. Azure Container Apps leitet den gesamten Datenverkehr zu HTTPS um.
- Zielport: 80
Klicken Sie auf Überprüfen + erstellen. Wenn die Validierung erfolgreich war, wählen Sie die Schaltfläche Erstellen aus.
Wenn sie einen Fehler erhalten, liegt dies möglicherweise daran, dass Ihre Container-Apps-Umgebung zu lange inaktiv ist. Die einfachste Lösung besteht darin, den Prozess des Erneuten Erstellens der Container-App zu durchlaufen. Alternativ können Sie den folgenden Befehl ausführen, um die Container-App mit der Azure CLI zu erstellen:
az containerapp create --name acs-to-teams-meeting --resource-group $RESOURCE_GROUP \ --location westus --image acs-to-teams-meeting \ --cpu 0.25 --memory 0.5 --environment-name acs-to-teams-meeting-env \ --ingress-enabled true --ingress-target-port 80 --ingress-type External \ --ingress-protocol Https --ingress-traffic Anywhere
Navigieren Sie nach Abschluss der Bereitstellung der Container-App im Azure-Portal zu ihr, und wählen Sie im Übersichtsbildschirm die Anwendungs-URL aus, um die Anwendung anzuzeigen, die im nginx-Container ausgeführt wird!
Herzlichen Glückwunsch!
Sie haben dieses Lernprogramm abgeschlossen.
Liegt ein Problem mit diesem Abschnitt vor? Wenn ja, senden Sie uns Feedback, damit wir den Abschnitt verbessern können.