3

WCF 4ルーティングサービスを使用しており、(configを介してではなく)プログラムでサービスを構成する必要があります。私がこれを行うのを見た例はまれですが、次のようにMessageFilterTableを作成します。

            var filterTable=new MessageFilterTable<IEnumerable<ServiceEndpoint>>();

しかし、そのメソッドのジェネリックパラメーターはTFilterData(フィルター処理するデータのタイプ)であると想定されていますか?文字列を受け入れる独自のカスタムフィルターがありますが、この方法でフィルターテーブルを作成できますか?

これが機能する場合...ルーティングインフラストラクチャは、渡したリストからクライアントエンドポイントを作成しますか?

4

2 に答える 2

5

WCF 4 ルーティング サービスを作成し、プログラムで構成しました。私のコードは、必要以上に間隔が空いています (他の人にとっての保守性が懸念されるため、コメントが必要です) が、確実に機能します。これには 2 つのフィルターがあります。1 つは特定のアクションを特定のエンドポイントにフィルター処理し、2 番目は残りのアクションを汎用エンドポイントに送信します。

        // Create the message filter table used for routing messages
        MessageFilterTable<IEnumerable<ServiceEndpoint>> filterTable = new MessageFilterTable<IEnumerable<ServiceEndpoint>>();

        // If we're processing a subscribe or unsubscribe, send to the subscription endpoint
        filterTable.Add(
            new ActionMessageFilter(
                "http://etcetcetc/ISubscription/Subscribe",
                "http://etcetcetc/ISubscription/KeepAlive",
                "http://etcetcetc/ISubscription/Unsubscribe"),
            new List<ServiceEndpoint>()
            {
                new ServiceEndpoint(
                    new ContractDescription("ISubscription", "http://etcetcetc/"),
                    binding,
                    new EndpointAddress(String.Format("{0}{1}{2}", TCPPrefix, HostName, SubscriptionSuffix)))
            },
            HighRoutingPriority);

        // Otherwise, send all other packets to the routing endpoint
        MatchAllMessageFilter filter = new MatchAllMessageFilter();
        filterTable.Add(
            filter,
            new List<ServiceEndpoint>()
            {
                new ServiceEndpoint(
                    new ContractDescription("IRouter", "http://etcetcetc/"),
                    binding,
                    new EndpointAddress(String.Format("{0}{1}{2}", TCPPrefix, HostName, RouterSuffix)))
            },
            LowRoutingPriority);

        // Then attach the filter table as part of a RoutingBehaviour to the host
        _routingHost.Description.Behaviors.Add(
            new RoutingBehavior(new RoutingConfiguration(filterTable, false)));
于 2011-11-10T04:58:56.443 に答える
3

ここで MSDN の良い例を見つけることができます:方法: 動的更新ルーティング テーブル

MessageFilterTable のインスタンスを直接作成するのではなく、新しい RoutingConfiguration インスタンスによって提供される「FilterTable」プロパティを使用する方法に注意してください。

カスタム フィルターを作成した場合は、次のように追加します。

rc.FilterTable.Add(new CustomMessageFilter("customStringParameter"), new List<ServiceEndpoint> { physicalServiceEndpoint });

CustomMessageFilter はあなたのフィルターになり、「customStringParameter」はあなたが話している(私が信じている)文字列です。ルーターが接続要求を受信すると、このテーブル エントリを介してそれをマップしようとします。これが成功した場合、ルーターはクライアント エンドポイントを作成して、指定した ServiceEndpoint と通信します。

于 2011-06-26T20:51:55.863 に答える