gpt4 book ai didi

azure - 如何确定 Azure 服务总线中哪些 channel 可供客户端使用

转载 作者:行者123 更新时间:2023-12-03 01:12:19 25 4
gpt4 key购买 nike

您好,

我正在使用 Azure AppFabric 服务总线构建一个程序。我的目的是通过具有相同命名空间的服务总线公开多个设备。每个设备使用“ServiceBusEnvironment.CreateServiceUri”方法通过服务总线与不同的“服务路径”创建连接。示例:

第一个主机:

Uri relayAddress1 = ServiceBusEnvironment.CreateServiceUri("https", "MyNamespace", "MyServicePath1 ");

第二个主机:

Uri relayAddress2 = ServiceBusEnvironment.CreateServiceUri("https", "MyNamespace", "MyServicePath2");

我想知道是否可以从服务总线检索信息,哪些主机连接可用。我可以想象“MyServicePath1”、“MyServicePath2”和“MyServicePath4”可用,但“MyServicePath3”不可用。在客户端,我可以尝试为每个主机打开 4 个 channel 并捕获 CommunicationException 以确定主机是否可用,但这感觉不是很有效。有没有办法在不捕获异常的情况下实现此目的?

提前致谢,

Stan Verdiesen

最佳答案

嗨桑德里诺·迪马蒂亚,

感谢您的快速回复。我已经尝试过你的解决方案并成功了!再次感谢。

为了完整性,我的实现:

服务主机上的 DiscoveryMode 属性:

        Uri relayAddress = ServiceBusEnvironment.CreateServiceUri(Uri.UriSchemeHttps, "MyNamespace", "MyServicePath1");

BasicHttpRelayBinding relayBinding = new BasicHttpRelayBinding();

ServiceHost serviceHost = new ServiceHost(typeof(ExternalDataExchangerTestServer));
ServiceEndpoint endPoint = serviceHost.AddServiceEndpoint(typeof(IExternalDataExchanger), relayBinding, relayAddress);

endPoint.Behaviors.Add(new TransportClientEndpointBehavior { TokenProvider = TokenProvider.CreateSharedSecretTokenProvider("YourName", "YourKey") });
endPoint.Behaviors.Add(new ServiceRegistrySettings { DiscoveryMode = DiscoveryType.Public });

serviceHost.Open();

通过代码读取原子提要的解决方案:

  public static List<string> GetAvailableServiceBusHosts(string serviceNamespace)
{
if (serviceNamespace == null)
throw new ArgumentNullException("serviceNamespace");

var relayAddress = ServiceBusEnvironment.CreateServiceUri(Uri.UriSchemeHttps, serviceNamespace, string.Empty);

var availableHosts = new List<string>();

var httpWebRequest = (HttpWebRequest)WebRequest.Create(relayAddress);

httpWebRequest.Proxy = null;
httpWebRequest.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
httpWebRequest.Method = WebRequestMethods.Http.Get;

using (var httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
{
using (var responseStream = httpWebResponse.GetResponseStream())
{
if (responseStream == null)
throw new NullReferenceException("responseStream");

var atomFormatter = new Atom10FeedFormatter();

var xmlReader = XmlReader.Create(responseStream);
atomFormatter.ReadFrom(xmlReader);

var syndicationFeed = atomFormatter.Feed;

foreach (var syndicationItem in syndicationFeed.Items)
{
availableHosts.Add(syndicationItem.Title.Text);
}

return availableHosts;
}
}
}

我希望这对其他人有帮助!

关于azure - 如何确定 Azure 服务总线中哪些 channel 可供客户端使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11600530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com