Szybki start: tworzenie aplikacji przedstawiającej liczbę gwiazd usługi GitHub za pomocą usług Azure Functions i SignalR Service za pośrednictwem języka C#
Artykuł
Z tego artykułu dowiesz się, jak używać usług SignalR Service i Azure Functions do tworzenia bezserwerowej aplikacji w języku C# w celu emisji komunikatów do klientów.
Kod wymieniony w tym artykule można pobrać z witryny GitHub.
Uwaga
Kod wymieniony w tym artykule można pobrać z witryny GitHub.
Ważne
Nieprzetworzone parametry połączenia są wyświetlane tylko w tym artykule w celach demonstracyjnych.
Parametry połączenia zawiera informacje o autoryzacji wymagane do uzyskania dostępu do usługi Azure SignalR Service przez aplikację. Klucz dostępu wewnątrz parametry połączenia jest podobny do hasła głównego usługi. W środowiskach produkcyjnych zawsze chroń klucze dostępu. Usługa Azure Key Vault umożliwia bezpieczne zarządzanie kluczami i obracanie ich oraz zabezpieczanie parametry połączenia przy użyciu identyfikatora Entra firmy Microsoft i autoryzowania dostępu za pomocą identyfikatora Entra firmy Microsoft.
Unikaj dystrybuowania kluczy dostępu do innych użytkowników, kodowania ich lub zapisywania ich w dowolnym miejscu w postaci zwykłego tekstu, który jest dostępny dla innych użytkowników. Obracanie kluczy, jeśli uważasz, że mogły one zostać naruszone.
Wymagania wstępne
W tym przewodniku Szybki start są wymagane następujące wymagania wstępne:
Tworzenie wystąpienia usługi Azure SignalR Service
W tej sekcji utworzysz podstawowe wystąpienie usługi Azure SignalR do użycia dla aplikacji. Poniższe kroki umożliwiają utworzenie nowego wystąpienia za pomocą witryny Azure Portal, ale można również użyć interfejsu wiersza polecenia platformy Azure. Aby uzyskać więcej informacji, zobacz polecenie az signalr create w dokumentacji interfejsu wiersza polecenia usługi Azure SignalR Service.
W lewym górnym rogu strony wybierz pozycję + Utwórz zasób.
Na stronie Tworzenie zasobu w polu tekstowym usługa wyszukiwania s i marketplace wprowadź signalr, a następnie wybierz pozycję SignalR Service z listy.
Na stronie SignalR Service wybierz pozycję Utwórz.
Na karcie Podstawy wprowadź podstawowe informacje dotyczące nowego wystąpienia usługi SignalR Service. Wprowadź następujące wartości:
Pole
Sugerowana wartość
opis
Subskrypcja
Wybierz swoją subskrypcję
Wybierz subskrypcję, której chcesz użyć, aby utworzyć nowe wystąpienie usługi SignalR Service.
Grupa zasobów:
Tworzenie grupy zasobów o nazwie SignalRTestResources
Wybierz lub utwórz grupę zasobów dla zasobu usługi SignalR. Warto utworzyć nową grupę zasobów na potrzeby tego samouczka zamiast używać istniejącej grupy zasobów. Aby zwolnić zasoby po ukończeniu samouczka, usuń grupę zasobów.
Usunięcie grupy zasobów powoduje również usunięcie wszystkich zasobów należących do grupy. Tej akcji nie można cofnąć. Przed usunięciem grupy zasobów upewnij się, że nie zawiera ona zasobów, które chcesz zachować.
Podaj unikatową nazwę zasobu do użycia dla zasobu usługi SignalR. Jeśli testsignalr jest już wykonany w Twoim regionie, dodaj cyfrę lub znak, dopóki nazwa nie będzie unikatowa.
Nazwa musi być ciągiem od 1 do 63 znaków i zawierać tylko cyfry, litery i znak łącznika (-). Nazwa nie może zaczynać ani kończyć się znakiem łącznika, a kolejne znaki łącznika są nieprawidłowe.
Region
Wybierz region
Wybierz odpowiedni region dla nowego wystąpienia usługi SignalR Service.
Wybierz pozycję Zmień , a następnie wybierz pozycję Bezpłatna (tylko tworzenie i testowanie). Wybierz pozycję Wybierz , aby potwierdzić wybór warstwy cenowej.
Usługa Azure SignalR Service ma trzy warstwy cenowe: Bezpłatna, Standardowa i Premium. Samouczki korzystają z warstwy Bezpłatna, chyba że określono inaczej w wymaganiach wstępnych.
Użyj wartości Domyślnej podczas hostowania logiki centrum SignalR w aplikacjach internetowych i używania usługi SignalR jako serwera proxy. Używaj technologii bezserwerowych , takich jak Azure Functions, do hostowania logiki centrum SignalR.
Tryb klasyczny jest przeznaczony tylko dla zgodności z poprzednimi wersjami i nie jest zalecany do użycia.
Nie musisz zmieniać ustawień na kartach Sieć i tagi samouczków usługi SignalR.
Wybierz przycisk Przejrzyj i utwórz w dolnej części karty Podstawy.
Na karcie Przeglądanie i tworzenie przejrzyj wartości, a następnie wybierz pozycję Utwórz. Ukończenie wdrożenia zajmuje kilka chwil.
Po zakończeniu wdrażania wybierz przycisk Przejdź do zasobu .
Na stronie zasobu usługi SignalR wybierz pozycję Klucze z menu po lewej stronie w obszarze Ustawienia.
Skopiuj parametry połączenia dla klucza podstawowego. Ta parametry połączenia jest potrzebna do skonfigurowania aplikacji w dalszej części tego samouczka.
Konfigurowanie i uruchamianie funkcji platformy Azure lokalnie
Do wykonania tego kroku potrzebne są narzędzia Azure Functions Core Tools.
Utwórz pusty katalog i przejdź do katalogu przy użyciu wiersza polecenia.
# Initialize a function project
func init --worker-runtime dotnet
# Add SignalR Service package reference to the project
dotnet add package Microsoft.Azure.WebJobs.Extensions.SignalRService
Bash
# Initialize a function project
func init --worker-runtime dotnet-isolated
# Add extensions package references to the project
dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Http
dotnet add package Microsoft.Azure.Functions.Worker.Extensions.SignalRService
dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Timer
Za pomocą edytora kodu utwórz nowy plik o nazwie Function.cs. Dodaj następujący kod do Function.cs:
using System;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Extensions.SignalRService;
using Newtonsoft.Json;
namespaceCSharp
{
publicstaticclassFunction
{
privatestatic HttpClient httpClient = new HttpClient();
privatestaticstring Etag = string.Empty;
privatestaticstring StarCount = "0";
[FunctionName("index")]
publicstatic IActionResult GetHomePage([HttpTrigger(AuthorizationLevel.Anonymous)]HttpRequest req, ExecutionContext context)
{
var path = Path.Combine(context.FunctionAppDirectory, "content", "index.html");
returnnew ContentResult
{
Content = File.ReadAllText(path),
ContentType = "text/html",
};
}
[FunctionName("negotiate")]
publicstatic SignalRConnectionInfo Negotiate(
[HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequest req,
[SignalRConnectionInfo(HubName = "serverless")] SignalRConnectionInfo connectionInfo)
{
return connectionInfo;
}
[FunctionName("broadcast")]
publicstaticasync Task Broadcast([TimerTrigger("*/5 * * * * *")] TimerInfo myTimer,
[SignalR(HubName = "serverless")] IAsyncCollector<SignalRMessage> signalRMessages)
{
var request = new HttpRequestMessage(HttpMethod.Get, "https://api.github.com/repos/azure/azure-signalr");
request.Headers.UserAgent.ParseAdd("Serverless");
request.Headers.Add("If-None-Match", Etag);
var response = await httpClient.SendAsync(request);
if (response.Headers.Contains("Etag"))
{
Etag = response.Headers.GetValues("Etag").First();
}
if (response.StatusCode == System.Net.HttpStatusCode.OK)
{
var result = JsonConvert.DeserializeObject<GitResult>(await response.Content.ReadAsStringAsync());
StarCount = result.StarCount;
}
await signalRMessages.AddAsync(
new SignalRMessage
{
Target = "newMessage",
Arguments = new[] { $"Current star count of https://github.com/Azure/azure-signalr is: {StarCount}" }
});
}
privateclassGitResult
{
[JsonRequired]
[JsonProperty("stargazers_count")]
publicstring StarCount { get; set; }
}
}
}
C#
using System.Net;
using System.Net.Http.Json;
using System.Text.Json.Serialization;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
namespacecsharp_isolated;
publicclassFunctions
{
privatestaticreadonly HttpClient HttpClient = new();
privatestaticstring Etag = string.Empty;
privatestaticint StarCount = 0;
[Function("index")]
publicstatic HttpResponseData GetHomePage([HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequestData req)
{
var response = req.CreateResponse(HttpStatusCode.OK);
response.WriteString(File.ReadAllText("content/index.html"));
response.Headers.Add("Content-Type", "text/html");
return response;
}
[Function("negotiate")]
publicstatic HttpResponseData Negotiate([HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequestData req,
[SignalRConnectionInfoInput(HubName = "serverless")] string connectionInfo)
{
var response = req.CreateResponse(HttpStatusCode.OK);
response.Headers.Add("Content-Type", "application/json");
response.WriteString(connectionInfo);
return response;
}
[Function("broadcast")]
[SignalROutput(HubName = "serverless")]
publicstaticasync Task<SignalRMessageAction> Broadcast([TimerTrigger("*/5 * * * * *")] TimerInfo timerInfo)
{
var request = new HttpRequestMessage(HttpMethod.Get, "https://api.github.com/repos/azure/azure-signalr");
request.Headers.UserAgent.ParseAdd("Serverless");
request.Headers.Add("If-None-Match", Etag);
var response = await HttpClient.SendAsync(request);
if (response.Headers.Contains("Etag"))
{
Etag = response.Headers.GetValues("Etag").First();
}
if (response.StatusCode == HttpStatusCode.OK)
{
var result = await response.Content.ReadFromJsonAsync<GitResult>();
if (result != null)
{
StarCount = result.StarCount;
}
}
returnnew SignalRMessageAction("newMessage", newobject[] { $"Current star count of https://github.com/Azure/azure-signalr is: {StarCount}" });
}
privateclassGitResult
{
[JsonPropertyName("stargazers_count")]
publicint StarCount { get; set; }
}
}
Kod w Function.cs ma trzy funkcje:
GetHomePage służy do pobierania witryny internetowej jako klienta.
Negotiate program jest używany przez klienta do uzyskiwania tokenu dostępu.
Broadcast Jest okresowo wywoływany w celu pobrania liczby gwiazdek z usługi GitHub, a następnie emisji komunikatów do wszystkich klientów.
Interfejs klienta dla tego przykładu jest stroną internetową. Renderujemy stronę internetową przy użyciu GetHomePage funkcji, odczytując zawartość HTML z content/index.html pliku. Teraz utwórzmy tę index.html w podkatalogu content z następującą zawartością:
Usługa Azure Functions wymaga, aby konto magazynu działało. Możesz zainstalować i uruchomić emulator usługi Azure Storage.
Możesz też zaktualizować ustawienie tak, aby używało rzeczywistego konta magazynu za pomocą następującego polecenia:
To prawie gotowe teraz. Ostatnim krokiem jest ustawienie parametry połączenia usługi SignalR Service na ustawienia funkcji platformy Azure.
Upewnij się, że wystąpienie usługi SignalR Service zostało pomyślnie utworzone, wyszukując jego nazwę w polu wyszukiwania w górnej części portalu. Wybierz wystąpienie, aby je otworzyć.
Wybierz pozycję Klucze, aby wyświetlić parametry połączenia dla wystąpienia usługi SignalR Service.
Skopiuj parametry połączenia podstawową, a następnie uruchom następujące polecenie.
Po uruchomieniu funkcji platformy Azure lokalnie otwórz plik http://localhost:7071/api/indexi zobaczysz bieżącą liczbę gwiazdek. Jeśli gwiazda lub gwiazda w usłudze GitHub, co kilka sekund zostanie odświeżona liczba gwiazdek.
Czyszczenie zasobów
Jeśli nie zamierzasz w przyszłości korzystać z tej aplikacji i nie chcesz, aby zostały naliczone jakiekolwiek opłaty, wykonaj następujące czynności w celu usunięcia wszystkich zasobów w ramach tego przewodnika Szybki start:
W witrynie Azure Portal wybierz grupy zasobów daleko po lewej stronie, a następnie wybierz utworzoną grupę zasobów. Możesz też użyć pola wyszukiwania, aby odnaleźć grupę zasobów po nazwie.
W otworzonym oknie wybierz grupę zasobów, a następnie kliknij pozycję Usuń grupę zasobów.
W nowym oknie wpisz nazwę grupy zasobów, która ma zostać usunięta, a następnie kliknij pozycję Usuń.
W tym przewodniku Szybki start utworzono i uruchomiono lokalnie aplikację bezserwerową w czasie rzeczywistym. Następnie dowiedz się więcej na temat dwukierunkowej komunikacji między klientami i usługą Azure Functions za pomocą usługi Azure SignalR Service.
Wijzig een updatemechanisme voor JavaScript-web-apps van polling naar realtime push-gebaseerde architectuur met SignalR Service, Azure Cosmos DB en Azure Functions. Gebruik Vue.js en JavaScript om SignalR te gebruiken met Visual Studio Code.
Bouw end-to-end-oplossingen in Microsoft Azure om Azure Functions te maken, web-apps te implementeren en te beheren, oplossingen te ontwikkelen die gebruikmaken van Azure Storage en meer.