WCF маршрутизация - как правильно добавить таблицу фильтров программно

Я использую службу маршрутизации WCF 4, и мне нужно настроить службу программно (в отличие от конфигурации). Примеры, которые я видел, которые делают это редко, создают MessageFilterTable следующим образом:

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

Но общий параметр этого метода должен быть TFilterData (тип данных, по которым вы фильтруете)? У меня есть свой собственный фильтр, который принимает строку - могу ли я создать таблицу фильтров таким образом?

Если это сработает... создаст ли инфраструктура маршрутизации клиентские конечные точки из списка, в который я передаю?

2 ответа

Я создал службу маршрутизации 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)));

Вы можете найти хороший пример на MSDN здесь: Как: таблица маршрутизации с динамическим обновлением

Обратите внимание, что они не создают непосредственно экземпляр MessageFilterTable, а вместо этого используют свойство FilterTable, предоставляемое новым экземпляром RoutingConfiguration.

Если вы написали собственный фильтр, то добавите его так:

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

CustomMessageFilter будет вашим фильтром, а "customStringParameter" - это строка, о которой (я полагаю) вы говорите. Когда маршрутизатор получает запрос на подключение, он пытается сопоставить его с помощью этой записи таблицы, если это успешно, то вы правы, маршрутизатор создаст клиентскую конечную точку для связи с предоставленной вами точкой ServiceEndpoint.

Другие вопросы по тегам