使用 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
}