こんにちは、
Azure AppFabricServiceBusを使用してプログラムを構築しています。私の意図は、同じ名前空間のServiceBusを介して複数のデバイスを公開することです。すべてのデバイスは、「ServiceBusEnvironment.CreateServiceUri」メソッドを使用して、異なる「サービスパス」でサービスバスを介して接続を作成します。例:最初のホスト:Uri relayAddress1 = ServiceBusEnvironment.CreateServiceUri( "https"、 "MyNamespace"、 "MyServicePath1");2番目のホスト:Uri relayAddress2 = ServiceBusEnvironment.CreateServiceUri( "https"、 "MyNamespace"、 "MyServicePath2");どのホスト接続が利用できるのか、ServiceBusから情報を取得できるのではないかと思います。「MyServicePath1」、「MyServicePath2」、「MyServicePath4」は使用可能ですが、「MyServicePath3」は使用できないと想像できます。クライアント側では、各ホストに対して4つのチャネルを開き、CommunicationExceptionをキャッチして、ホストが使用可能かどうかを判断することができますが、それはあまり効率的ではありません。例外をキャッチせずにこれを達成する方法はありますか?前もって感謝します、スタン・ヴェルディセン
質問する
1254 次
2 に答える
2
こんにちは、サンドリーノ・ディ・マティアです。
迅速なご対応ありがとうございます。私は成功してあなたのソリューションを試しました! 再度、感謝します。
完全を期すために、私の実装:
サービス ホストの 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;
}
}
}
これが他の人に役立つことを願っています!
于 2012-07-23T09:25:55.207 に答える
1
ServiceRegistrySettingsのDiscoveryModeをPublicに設定すると、サービスは Atom フィードで利用できるようになります。これが完了したら、名前空間の URL にアクセスして、サービスのリストを取得できます: http:// service-namespace .servicebus.windows.net/
于 2012-07-22T13:57:10.283 に答える