Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
No tutorial Criar um aplicativo de chat, você aprendeu a usar APIs do WebSocket para enviar e receber dados com o Azure Web PubSub. Você pode ver que não há nenhum protocolo necessário quando o cliente está se comunicando com o serviço. Por exemplo, você pode enviar qualquer tipo de dados usando WebSocket.send() e o servidor os recebe exatamente como está. O processo de APIs do WebSocket é fácil de usar, mas a funcionalidade é limitada. Por exemplo, você não pode especificar o nome do evento ao enviar o evento para o servidor ou publicar mensagem para outros clientes em vez de enviá-lo para o servidor. Neste tutorial, você aprenderá a usar o subprotocolo para estender a funcionalidade do cliente.
Neste tutorial, você aprenderá a:
- Criar uma instância do serviço Web PubSub
- Gerar a URL completa para estabelecer a conexão WebSocket
- Publicar mensagens entre clientes WebSocket usando um subprotocolo
Se você ainda não tiver uma conta do Azure, crie uma conta gratuita antes de começar.
Pré-requisitos
Use o ambiente Bash no Azure Cloud Shell. Para obter mais informações, confira Introdução ao Azure Cloud Shell.
Se preferir executar os comandos de referência da CLI localmente, instale a CLI do Azure. Para execuções no Windows ou no macOS, considere executar a CLI do Azure em um contêiner do Docker. Para obter mais informações, confira Como executar a CLI do Azure em um contêiner do Docker.
Se estiver usando uma instalação local, entre com a CLI do Azure usando o comando az login. Para concluir o processo de autenticação, siga as etapas exibidas no terminal. Para obter outras opções de entrada, consulte Autenticar no Azure usando a CLI do Azure.
Quando solicitado, instale a extensão da CLI do Azure no primeiro uso. Para obter mais informações sobre extensões, confira Usar e gerenciar extensões com a CLI do Azure.
Execute az version para localizar a versão e as bibliotecas dependentes que estão instaladas. Para fazer a atualização para a versão mais recente, execute az upgrade.
- Essa configuração requer a versão 2.22.0 ou superior da CLI do Azure. Se você está usando o Azure Cloud Shell, a versão mais recente já está instalada.
Importante
As cadeias de conexão brutas aparecem neste artigo somente para fins de demonstração.
Uma cadeia de conexão inclui as informações de autorização necessárias para que o seu aplicativo acesse o serviço Azure Web PubSub. A chave de acesso dentro da cadeia de conexão é semelhante a uma senha raiz para o serviço. Em ambientes de produção, sempre proteja suas chaves de acesso. Use o Azure Key Vault para gerenciar e girar suas chaves com segurança e proteger sua conexão com WebPubSubServiceClient.
Evite distribuir chaves de acesso para outros usuários, fazer hard-coding com elas ou salvá-las em qualquer lugar em texto sem formatação que seja acessível a outras pessoas. Gire suas chaves se você acredita que elas podem ter sido comprometidas.
Criar uma instância do Azure Web PubSub
Criar um grupo de recursos
Um grupo de recursos é um contêiner lógico no qual os recursos do Azure são implantados e gerenciados. Use o comando az group create para criar um grupo de recursos chamado myResourceGroup no local eastus.
az group create --name myResourceGroup --location EastUS
Criar uma instância do Web PubSub
Execute az extension add para instalar ou atualizar a extensão webpubsub para a versão atual.
az extension add --upgrade --name webpubsub
Use o comando az webpubsub create da CLI do Azure para criar um Web PubSub no grupo de recursos criado. O seguinte comando cria um recurso gratuito do Web PubSub no grupo de recursos myResourceGroup no EastUS:
Importante
Cada recurso Web PubSub precisa ter um nome exclusivo. Substitua <nome-de recurso-exclusivo> pelo nome do Web PubSub nos exemplos a seguir.
az webpubsub create --name "<your-unique-resource-name>" --resource-group "myResourceGroup" --location "EastUS" --sku Free_F1
A saída deste comando mostra as propriedades do recurso recém-criado. Anote as duas propriedades listadas abaixo:
-
Nome do Recurso: o nome que você forneceu ao parâmetro
--nameacima. -
hostName: no exemplo, o nome do host é
<your-unique-resource-name>.webpubsub.azure.com/.
Nesse ponto, sua conta do Azure é a única autorizada a executar qualquer operação nesse novo recurso.
Obter o ConnectionString para uso posterior
As cadeias de conexão brutas aparecem neste artigo somente para fins de demonstração. Em ambientes de produção, sempre proteja suas chaves de acesso. Use o Azure Key Vault para gerenciar e girar suas chaves com segurança e proteger sua conexão com WebPubSubServiceClient.
Use o comando az webpubsub key da CLI do Azure para obter a ConnectionString do serviço. Substitua o espaço reservado <your-unique-resource-name> pelo nome da instância do Azure Web PubSub.
az webpubsub key show --resource-group myResourceGroup --name <your-unique-resource-name> --query primaryConnectionString --output tsv
Copie a cadeia de conexão para usar mais tarde.
Copie o ConnectionString buscado e use posteriormente neste tutorial como o valor de <connection_string>.
Configurar o projeto
Pré-requisitos
Usar um subprotocolo
O cliente pode iniciar uma conexão WebSocket usando um subprotocolo específico. O serviço Azure Web PubSub dá suporte a um subprotocolo chamado json.webpubsub.azure.v1 para permitir que os clientes publiquem ou assinem diretamente por meio desse serviço, em vez de usar uma viagem de ida e volta para o servidor upstream. Confira Protocolo WebSocket JSON com suporte do Azure Web PubSub para obter detalhes sobre o subprotocolo.
Se você usar outros nomes de protocolo, eles serão ignorados pelo serviço e serão passados para o servidor no manipulador de eventos de conexão, então você poderá criar os próprios protocolos.
Agora vamos criar um aplicativo Web usando o subprotocolo json.webpubsub.azure.v1.
Instalar dependências
mkdir logstream cd logstream dotnet new web dotnet add package Microsoft.Extensions.Azure dotnet add package Azure.Messaging.WebPubSubCrie o lado do servidor para hospedar a API
/negotiatee a página da Web.Atualize
Program.cscom o código abaixo.- Use
AddAzureClientspara adicionar o cliente de serviço e leia a cadeia de conexão da configuração. - Adicione
app.UseStaticFiles();antes deapp.Run();para dar suporte a arquivos estáticos. - E atualize
app.MapGetpara gerar o token de acesso do cliente com solicitações/negotiate.
using Azure.Messaging.WebPubSub; using Microsoft.Extensions.Azure; var builder = WebApplication.CreateBuilder(args); builder.Services.AddAzureClients(s => { s.AddWebPubSubServiceClient(builder.Configuration["Azure:WebPubSub:ConnectionString"], "stream"); }); var app = builder.Build(); app.UseStaticFiles(); app.MapGet("/negotiate", async context => { var service = context.RequestServices.GetRequiredService<WebPubSubServiceClient>(); var response = new { url = service.GetClientAccessUri(roles: new string[] { "webpubsub.sendToGroup.stream", "webpubsub.joinLeaveGroup.stream" }).AbsoluteUri }; await context.Response.WriteAsJsonAsync(response); }); app.Run();- Use
Criar a página da Web
Crie uma página HTML com o conteúdo abaixo e salve-a como
wwwroot/index.html:<html> <body> <div id="output"></div> <script> (async function () { let res = await fetch('/negotiate') let data = await res.json(); let ws = new WebSocket(data.url, 'json.webpubsub.azure.v1'); ws.onopen = () => { console.log('connected'); }; let output = document.querySelector('#output'); ws.onmessage = event => { let d = document.createElement('p'); d.innerText = event.data; output.appendChild(d); }; })(); </script> </body> </html>O código acima se conecta com o serviço e imprime qualquer mensagem recebida na página. A principal alteração é que especificamos o subprotocolo ao criar a conexão WebSocket.
Executar o servidor
Usamos a ferramenta Gerenciador de Segredos para .NET Core para definir a cadeia de conexão. Execute o comando abaixo, substituindo
<connection_string>pelo que foi buscado na etapa anterior e abra http://localhost:5000/index.html no navegador:dotnet user-secrets init dotnet user-secrets set Azure:WebPubSub:ConnectionString "<connection-string>" dotnet runSe você estiver usando o Chrome, poderá pressionar F12 ou clicar com o botão direito do mouse em ->Inspecionar ->Ferramentas do desenvolvedor e selecionar a guia Rede. Carregue a página da Web e você pode ver que a conexão WebSocket está estabelecida. Selecione para inspecionar a conexão WebSocket. Você pode ver abaixo que a mensagem de evento
connectedé recebida no cliente. Você pode ver que oconnectionIdpode ser gerado para esse cliente.{"type":"system","event":"connected","userId":null,"connectionId":"<the_connection_id>"}
Você pode ver que, com a ajuda do subprotocolo, você poderá obter alguns metadados da conexão quando a conexão for connected.
O cliente agora recebe uma mensagem JSON em vez de um texto sem formatação. A mensagem JSON contém mais informações, como tipo e origem da mensagem. Portanto, você pode usar essas informações para processamento adicional da mensagem (por exemplo, exibir a mensagem em um estilo diferente se for de uma fonte diferente), que você pode encontrar nas seções posteriores.
Publicar mensagens do cliente
No tutorial Criar um aplicativo de chat, quando o cliente envia uma mensagem por meio da conexão WebSocket para o serviço Web PubSub, o serviço dispara um evento de usuário no lado do servidor. Com o subprotocolo, o cliente tem mais funcionalidades enviando uma mensagem JSON. Por exemplo, você pode publicar mensagens diretamente do cliente por meio do serviço Web PubSub para outros clientes.
Isso é útil se você quiser transmitir uma grande quantidade de dados para outros clientes em tempo real. Vamos usar esse recurso para criar um aplicativo de streaming de log, que pode transmitir logs de console para o navegador em tempo real.
Criar o programa de streaming
Crie um programa
stream:mkdir stream cd stream dotnet new consoleAtualize
Program.cscom o seguinte conteúdo:using System; using System.Net.Http; using System.Net.WebSockets; using System.Text; using System.Text.Json; using System.Threading.Tasks; namespace stream { class Program { private static readonly HttpClient http = new HttpClient(); static async Task Main(string[] args) { // Get client url from remote var stream = await http.GetStreamAsync("http://localhost:5000/negotiate"); var url = (await JsonSerializer.DeserializeAsync<ClientToken>(stream)).url; var client = new ClientWebSocket(); client.Options.AddSubProtocol("json.webpubsub.azure.v1"); await client.ConnectAsync(new Uri(url), default); Console.WriteLine("Connected."); var streaming = Console.ReadLine(); while (streaming != null) { if (!string.IsNullOrEmpty(streaming)) { var message = JsonSerializer.Serialize(new { type = "sendToGroup", group = "stream", data = streaming + Environment.NewLine, }); Console.WriteLine("Sending " + message); await client.SendAsync(Encoding.UTF8.GetBytes(message), WebSocketMessageType.Text, true, default); } streaming = Console.ReadLine(); } await client.CloseAsync(WebSocketCloseStatus.NormalClosure, null, default); } private sealed class ClientToken { public string url { get; set; } } } }Você pode ver que há um novo conceito de "grupo" aqui. Grupo é um conceito lógico em um hub em que você pode publicar a mensagem em um grupo de conexões. Em um hub, você pode ter vários grupos e um cliente pode assinar vários grupos ao mesmo tempo. Ao usar um subprotocolo, você só pode publicar em um grupo em vez de fazer a transmissão para o hub inteiro. Para obter detalhes sobre os termos, confira os conceitos básicos.
Como usamos o grupo aqui, também precisamos atualizar a página da Web
index.htmlpara ingressar no grupo quando a conexão WebSocket for estabelecida dentro do retorno de chamadaws.onopen.let ackId = 0; ws.onopen = () => { console.log('connected'); ws.send(JSON.stringify({ type: 'joinGroup', group: 'stream', ackId: ++ackId })); };Você pode ver o cliente ingressar no grupo enviando uma mensagem no tipo
joinGroup.Atualize também a lógica de retorno de chamada
ws.onmessageligeiramente para analisar a resposta JSON e imprimir as mensagens somente do grupostreampara que ela atue como uma impressora de transmissão ao vivo.ws.onmessage = event => { let message = JSON.parse(event.data); if (message.type === 'message' && message.group === 'stream') { let d = document.createElement('span'); d.innerText = message.data; output.appendChild(d); window.scrollTo(0, document.body.scrollHeight); } };Por questões de segurança, por padrão, um cliente não pode publicar ou assinar um grupo por conta própria. Então você notou que definimos
rolespara o cliente ao gerar o token:Defina o
rolesquandoGenerateClientAccessUriestiver emStartup.cs, conforme descrito abaixo:service.GenerateClientAccessUri(roles: new string[] { "webpubsub.sendToGroup.stream", "webpubsub.joinLeaveGroup.stream" })Por fim, aplique também algum estilo a
index.htmlpara que tenha uma boa aparência.<html> <head> <style> #output { white-space: pre; font-family: monospace; } </style> </head>
Agora execute o código abaixo e digite qualquer texto e eles serão exibidos no navegador em tempo real:
ls -R | dotnet run
# Or call `dir /s /b | dotnet run` when you are using CMD under Windows
Ou você o torna mais lento para que possa ver que os dados são transmitidos para o navegador em tempo real:
for i in $(ls -R); do echo $i; sleep 0.1; done | dotnet run
O exemplo de código completo deste tutorial pode ser encontrado aqui.
Próximas etapas
Este tutorial fornece uma ideia básica de como se conectar ao serviço Web PubSub e como publicar mensagens nos clientes conectados usando o subprotocolo.
Confira outros tutoriais para saber mais sobre como usar o serviço.