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.