1

こんにちは、

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をキャッチして、ホストが使用可能かどうかを判断することができますが、それはあまり効率的ではありません。例外をキャッチせずにこれを達成する方法はありますか?

前もって感謝します、

スタン・ヴェルディセン

4

2 に答える 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のDiscoveryModePublicに設定すると、サービスは Atom フィードで利用できるようになります。これが完了したら、名前空間の URL にアクセスして、サービスのリストを取得できます: http:// service-namespace .servicebus.windows.net/

リファレンス:方法: Service Bus アプリケーションを検出して公開する

于 2012-07-22T13:57:10.283 に答える