0

使用 Azure 混合连接连接到本地服务

在生产中,使用以下代码使用 websocket 协议将消息连接并发送到 Azure 混合连接。

当目标 Azure 混合连接不可用时,它会抛出错误“消息”:“Microsoft.Azure.Relay.EndpointNotFoundException:无法解析远程名称:'myAzureHC-dev.servicebus.windows.net'”,

  try
    {
       var tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(relayKey, relayKeyValue);

        var hcClient = new HybridConnectionClient(new Uri(String.Format("sb://{0}/{1}", relayNamespace, relayConnectionName)), tokenProvider);

        HybridConnectionStream hcStream = await hcClient .CreateConnectionAsync();

        StreamWriter writer = new StreamWriter(hcStream ) { AutoFlush = true };

        await writer.WriteLineAsync(jsonPayload); 
      }
 catch (RelayException ex)
        {
          //this block executes when Azure Hybrid Connection not available
        }

最近尝试使用 http 协议连接并发送消息到 Azure 混合连接,如下所示,

当目标 Azure 混合连接不可用时,它会抛出不同的异常类型和消息”:“System.Net.Http.HttpRequestException:发送请求时发生错误。”这与 websocket 连接方式抛出的异常类型和消息不同到同一场景的 Azure 混合连接,即 Azure 混合连接不可用场景

这种异常类型和消息的差异破坏了从 websocket 迁移到连接到 Azure 混合连接的最新 HTTP 方式后的向后兼容性。同样,对于“AuthorizationFailure”、“EndpointNotFound”等其他场景,在连接到 Azure 混合连接的“HTTP”方式中不会引发异常。

如何克服旧的“websocket”方式和最新的“HTTP”方式连接到 Azure 混合连接的异常消息差异?因此支持在迁移后向后兼容现有的 PRODUCTION 客户端。

     try
       {
         var tokenProvider = 
         TokenProvider.CreateSharedAccessSignatureTokenProvider(relayKey, relayKeyValue);

        var uri = new Uri(string.Format(String.Format("sb://{0}/{1}", relayNamespace, relayConnectionName));

        var token = (await tokenProvider.GetTokenAsync(uri.AbsoluteUri, TimeSpan.FromMinutes(5))).TokenString; 

       var response = await _httpClient.PostAsync(uri, content);
      }
    catch (RelayException ex)
    {
    }
    catch (HTTPRequestException ex)
    {
          //this block executes when Azure Hybrid Connection not available
    }
4

0 回答 0