Wysyłanie żądań za pośrednictwem połączenia hybrydowego usługi Azure Relay

Ukończone

Aby wysyłać i odbierać komunikaty za pośrednictwem usługi Azure Relay, należy wiedzieć, jak pisać niezbędny kod.

Załóżmy, że utworzono przekaźnik dla usługi sprawdzania środków w usłudze Azure Relay. Teraz chcesz zmodyfikować swoją usługę sprawdzającą środki oraz klientów, którzy ją wywołują, aby można było wysyłać komunikaty za pośrednictwem przekaźnika. Musisz wiedzieć, jak napisać ten kod.

W tej lekcji używamy klas, takich jak HybridConnectionListener i HttpRequestMessage do wysyłania komunikatów i odpowiadania na nie.

Przekazywanie poświadczeń przy użyciu klasy TokenProvider

Składniki odbiornika i nadawcy muszą zidentyfikować się w usłudze Azure Relay, gdy się z nią łączą. W przypadku każdego połączenia hybrydowego należy użyć klasy TokenProvider platformy .NET, aby przekazać te informacje. Po utworzeniu zasad dostępu współużytkowanego w przestrzeni nazw platforma Azure utworzyła klucz podstawowy i pomocniczy. Ten klucz jest poświadczeniem dodawanym do klasy TokenProvider w celu zabezpieczenia komunikacji.

Poniższy kod pokazuje, jak skonfigurować poświadczenia i dodać je do klasy TokenProvider:

// Store credentials. In production code, keep these values in a secure location, such as Azure Key Vault.
private const string KeyName = "RootManageSharedAccessKey";
private const string Key = "<your key here>";

// Create and configure TokenProvider.
var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(KeyName, Key);

Łączenie odbiornika z usługą Azure Relay

Aby połączyć odbiornik z usługą Azure Relay, należy utworzyć i skonfigurować wystąpienie klasy HybridConnectionListener. Przekaż identyfikator URI dla przekaźnika i klasę TokenProvider do konstruktora.

// Store the connection details.
private const string RelayNamespace = "{RelayNamespace}.servicebus.windows.net";
private const string ConnectionName = "{HybridConnectionName}";

// Create and configure the listener.
var listener = new HybridConnectionListener(new Uri(string.Format("sb://{0}/{1}", RelayNamespace, ConnectionName)), tokenProvider);

Następnie zasubskrybuj odpowiednie zdarzenia w przekaźniku, takie jak zdarzenia połączenia.

listener.Connecting += (o, e) => { Console.WriteLine("Connecting"); };
listener.Offline += (o, e) => { Console.WriteLine("Offline"); };
listener.Online += (o, e) => { Console.WriteLine("Online"); };

Aby skonfigurować sposób odpowiadania odbiornika na komunikaty, użyj jego właściwości RequestHandler. Aby wysłać odpowiedź, użyj właściwości StreamWriter.

listener.RequestHandler = (context) =>
{
    // Configure the response status.
    context.Response.StatusCode = HttpStatusCode.OK;
    context.Response.StatusDescription = "OK";
    // Use a stream writer to send text back.
    using (var sw = new StreamWriter(context.Response.OutputStream))
    {
        sw.WriteLine("hello!");
    }
    // Remember to close the context.
    context.Response.Close();
};

Po skonfigurowaniu odbiornika otwórz go, aby rozpocząć nasłuchiwanie komunikatów. Ze względu na to, że przekaźnik, odbiornik i nadawca są hostowane w różnych lokalizacjach, odpowiedź na komunikaty może zająć trochę czasu. Ważne jest, aby używać kodu asynchronicznego dla tych komunikatów, aby upewnić się, że aplikacja nie przestaje odpowiadać, ponieważ czeka na odpowiedzi. Zwróć uwagę na asynchroniczne await nazwy słów kluczowych i metod asynchronicznych w następującym kodzie:

await listener.OpenAsync()

Pamiętaj, aby zamknąć odbiornik w odpowiednim miejscu w kodzie:

await listener.CloseAsync();

Łączenie nadawcy z usługą Azure Relay

W przypadku nadawcy nie ma żadnego obiektu specyficznego dla usługi Azure Relay. Możesz użyć standardowego obiektu HttpRequestMessage, tak jak podczas wywoływania dowolnej usługi internetowej.

// Store the connection details.
private const string RelayNamespace = "{RelayNamespace}.servicebus.windows.net";
private const string ConnectionName = "{HybridConnectionName}";

// Formulate the URI.
var uri = new Uri(string.Format("https://{0}/{1}", RelayNamespace, ConnectionName));

// Create and configure the client. Use the Content property to specify the message text.
var client = new HttpClient();
var request = new HttpRequestMessage()
{
    RequestUri = uri,
    Method = HttpMethod.Get,
    Content = new StringContent("Obtain credit check for Sara McMurray")
};

Aby przekazać token, dodaj go do nagłówków żądania:

// Create the token from the token provider.
var token = (await tokenProvider.GetTokenAsync(uri.AbsoluteUri, TimeSpan.FromHours(1))).TokenString;

// Add the token to the headers.
request.Headers.Add("ServiceBusAuthorization", token);

Teraz możesz wysłać komunikat przy użyciu metody SendAsync i uzyskać odpowiedź asynchronicznie:

// Send the request.
var response = await client.SendAsync(request);

// Display the result.
Console.WriteLine(await response.Content.ReadAsStringAsync());