0

現在、 WCFディスカバリーを使用し、ディスカバリーエンドポイントとアナウンスエンドポイントを提供するサービスを実装しています。また、クライアントでアナウンス/検出されたエンドポイントをフィルタリングするためにスコープを使用する必要があります。

ディスカバリーエンドポイントにスコープを追加することはうまくいきますが、アナウンスメントエンドポイントの正しい構成を理解できません。これが私が思いついたものです:

<serviceBehaviors>
    <behavior name="MyServiceBehavior">
        <serviceMetadata httpGetEnabled="True"/>
        <serviceDiscovery>
            <announcementEndpoints>
                <endpoint kind="udpAnnouncementEndpoint"      
                          behaviorConfiguration="DiscoveryBehavior" />                          
            </announcementEndpoints>
        </serviceDiscovery>
    </behavior>
</serviceBehaviors>
<endpointBehaviors>
    <behavior name="DiscoveryBehavior">
        <endpointDiscovery>
            <scopes>
                <add scope="http://My/Scope"/>
            </scopes>
        </endpointDiscovery>
    </behavior>
</endpointBehaviors>

ディスカバリーエンドポイント用に作成したエンドポイントの動作を再利用しているため、正しくないと思います。しかし、それが私のスコープを説明するために私が見つけた唯一の方法です。

アナウンスにスコープを使用できるのは、次の理由からだと思います。

  • 受信したアナウンスをフィルタリングする他の方法はありません
  • クラス(EndpointDiscoveryMetadataアナウンスを受信したときに取得するインスタンス)には、プロパティScopesが含まれています。

しかし、私の構成ではScopes、クライアント側のコレクションは、mex 1を除くすべてのエンドポイントで空です(2つのtempuriスコープが含まれています)。

では、アナウンスエンドポイントのスコープを正しく宣言する方法はありますか?どんな助けでもありがたいです、事前に感謝します。

4

1 に答える 1

0

実際、自分で理解しただけです(MSDNの構成サンプルを使用して、以前は見つかりませんでした)。

重要なのは、DiscoveryBehaviorを、アナウンスエンドポイントではなく、検出可能なすべてのサービスエンドポイントに適用することです。

それで、

<services>
    <service name="MyService" behaviorConfiguration="MyServiceBehavior">
        <endpoint address="MyService/" binding="wsHttpBinding"
                  contract="IMyService"
                  behaviorConfiguration="DiscoveryBehavior" />
        <endpoint address="mex" binding="mexHttpBinding" 
                  contract="IMetadataExchange"/>
        <endpoint kind="udpDiscoveryEndpoint" />
    </service>
</services>

<behaviors>
    <serviceBehaviors>
    <behavior name="MyServiceBehavior">
        <serviceMetadata httpGetEnabled="True"/>
        <serviceDiscovery>
            <announcementEndpoints>
                <endpoint kind="udpAnnouncementEndpoint" />                          
            </announcementEndpoints>
        </serviceDiscovery>
    </behavior>
    </serviceBehaviors>

    <endpointBehaviors>
        <behavior name="DiscoveryBehavior">
            <endpointDiscovery>
                <scopes>
                    <add scope="http://My/Scope"/>
                </scopes>
            </endpointDiscovery>
        </behavior>
    </endpointBehaviors>
</behaviors>

これは機能し、クライアント側でスコープを取得します。私はそれが誰かを助けることを願っています。

于 2011-05-31T05:08:54.040 に答える