WCF路由 - 如何以编程方式正确添加过滤器表

时间:2011-05-25 00:04:56

标签: wcf wcf-routing

我正在使用WCF 4路由服务,需要以编程方式配置服务(而不是通过配置)。我看到这样做的例子很少见,它创建了一个MessageFilterTable,如下所示:

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

但是,该方法的泛型参数应该是TFilterData(您要过滤的数据类型)?我有自己的自定义过滤器,接受一个字符串 - 我仍然可以这样创建过滤表吗?

如果这样做......路由基础设施是否会在我传入的列表中创建客户端端点?

2 个答案:

答案 0 :(得分:5)

我创建了一个WCF 4路由服务并以编程方式对其进行了配置。我的代码比它需要的间隔更多(其他人的可维护性是一个问题,因此评论),但它肯定有效。这有两个过滤器:一个过滤器对给定端点过滤一些特定的动作,第二个过滤器将剩余的动作发送到一个通用端点。

        // 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)));

答案 1 :(得分:3)

您可以在MSDN上找到一个很好的示例:How To: Dynamic Update Routing Table

注意他们不直接创建MessageFilterTable的实例,而是使用新的RoutingConfiguration实例提供的“FilterTable”属性。

如果您已编写自定义过滤器,则会按以下方式添加:

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

CustomMessageFilter将是您的过滤器,“customStringParameter”是您(我相信)您正在谈论的字符串。 当路由器收到连接请求时,它将尝试通过此表条目映射它,如果成功,那么你是对的,路由器将创建一个客户端端点与你提供的ServiceEndpoint通信。