Inviare richieste tramite una connessione ibrida di Inoltro di Azure

Completato

Per inviare e ricevere messaggi tramite Inoltro di Azure, è necessario saper scrivere il codice a questo scopo.

Si supponga di aver creato l'inoltro per il servizio di verifica del credito in Inoltro di Azure. Si vuole ora modificare il servizio di verifica del credito e i client che lo chiamano, in modo che possano inviare messaggi tramite l'inoltro. È necessario saper scrivere questo codice.

In questa unità vengono usate classi come HybridConnectionListener e HttpRequestMessage per inviare messaggi e rispondervi.

Usare TokenProvider per passare le credenziali

Quando si connettono, i componenti listener e mittente devono identificare se stessi in Inoltro di Azure. Per qualsiasi connessione ibrida, è possibile usare la classe .NET TokenProvider per passare queste informazioni. Quando sono stati creati criteri di accesso condiviso nello spazio dei nomi, Azure ha creato una chiave primaria e una secondaria. Queste chiavi sono le credenziali che devono essere aggiunte a TokenProvider per proteggere le comunicazioni.

Questo codice mostra come configurare le credenziali e aggiungerle a 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);

Connettere un listener a Inoltro di Azure

Per connettere un listener al servizio Inoltro di Azure, è necessario creare e configurare un'istanza della classe HybridConnectionListener. Passare l'URI per l'inoltro e TokenProvider al costruttore.

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

Sottoscrivere quindi gli eventi pertinenti nell'inoltro, ad esempio gli eventi di connessione.

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

Per configurare il modo in cui il listener risponde ai messaggi, usare la relativa proprietà RequestHandler. Per inviare una risposta, usare 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();
};

Dopo aver configurato il listener, aprirlo per avviare l'ascolto dei messaggi. Poiché l'inoltro, il listener e il mittente sono tutti ospitati in posizioni diverse, la risposta ai messaggi può richiedere tempo. È importante usare codice asincrono per questi messaggi per evitare che l'app sembri smettere di rispondere durante l'attesa delle risposte. Notare la parola chiave asincrona await e i nomi dei metodi asincroni nel codice seguente:

await listener.OpenAsync()

Ricordare di chiudere il listener in un punto appropriato nel codice:

await listener.CloseAsync();

Connettere un mittente a Inoltro di Azure

Per il mittente, non esiste alcun oggetto specifico di Inoltro di Azure. È possibile usare un oggetto HttpRequestMessage standard, analogamente a quando si chiama qualsiasi servizio Web.

// 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")
};

Per passare il token, aggiungerlo alle intestazioni delle richieste:

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

È ora possibile inviare un messaggio usando il metodo SendAsync e ottenere una risposta in modo asincrono:

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

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