Enviar pedidos através de uma ligação híbrida do Azure Relay

Concluído

Para enviar e receber mensagens através do Azure Relay, tem de compreender como escrever o código necessário.

Suponhamos que criou o reencaminhamento para o serviço de verificação de crédito no Azure Relay. Agora, quer modificar o serviço de verificação de crédito e os clientes que o chamam, para que possam enviar mensagens através do reencaminhamento. Tem de saber como escrever este código.

Nesta unidade, verá como utilizar classes como HybridConnectionListener e HttpRequestMessage para enviar e responder a mensagens.

Utilizar o TokenProvider para transmitir credenciais

Os componentes de serviço de escuta e do remetente têm de ser identificados no Azure Relay quando se ligam. Para qualquer ligação híbrida, utilize a classe .NET TokenProvider para transmitir esta informação. Quando criou uma política de acesso partilhado no espaço de nomes, o Azure criou uma chave primária e secundária. Esta chave é a credencial que irá adicionar a TokenProvider para proteger as comunicações.

Este código mostra como configurar as credenciais e adicioná-las 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);

Ligar um serviço de escuta ao Azure Relay

Para ligar um serviço de escuta ao Azure Relay, pode criar e configurar uma instância da classe HybridConnectionListener. Transmita o URI do reencaminhamento e o TokenProvider para o construtor.

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

Em seguida, subscreva eventos relevantes no reencaminhamento, como eventos de ligação.

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

Para configurar a forma como o serviço de escuta responde às mensagens, utilize a propriedade RequestHandler. Para enviar uma resposta, utilize 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();
};

Quando configurar o serviço de escuta, abra-o para começar a escutar mensagens. Como o reencaminhamento, o serviço de escuta e o remetente estão todos alojados em locais diferentes, podem demorar algum tempo a responder às mensagens. É importante utilizar código assíncrono para estas mensagens, para garantir que a sua aplicação não fica bloqueada enquanto aguarda as respostas. Irá reparar na palavra-chave assíncrona await e nos nomes de métodos assíncronos no seguinte código:

await listener.OpenAsync()

Não se esqueça de fechar o serviço de escuta num ponto adequado do código:

await listener.CloseAsync();

Ligar um remetente ao Azure Relay

Para o remetente, não existe nenhum objeto específico do Azure Relay. Pode utilizar um objeto HttpRequestMessage padrão, tal como faria quando chama para qualquer serviço 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")
};

Para transmitir o token, adicione-o aos cabeçalhos dos pedidos:

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

Agora, pode enviar uma mensagem com o método SendAsync e obter uma resposta de forma assíncrona:

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

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