Добавление инспекторов сообщений WCF во время выполнения - PullRequest
3 голосов
/ 28 декабря 2010

Я создал пользовательский ServiceHost, который я хотел бы использовать для автоматического добавления инспектора сообщений в каждую конечную точку службы, которая на нем работает. Я создал MessageInspector, который реализует IDispatchMessageInspector и IClientMessageInspector, и нашел следующий код, который должен добавить его в каждую конечную точку:

foreach (ChannelDispatcher channel in this.ChannelDispatchers) {
  foreach (EndpointDispatcher endpoint in channel.Endpoints) {
      endpoint.DispatchRuntime.MessageInspectors.Add(new MyMessageInspector());
   }
}

Проблема, с которой я сталкиваюсь, состоит в том, что коллекция ChannelDispatchers пуста до тех пор, пока не будет открыт сервисный узел, что означает, что я не могу запустить этот код в конструкторе. Я создал обработчик событий для события Opened и вместо этого использовал этот код, но затем при попытке добавить конечную точку получаю следующую ошибку:

This value cannot be changed after a ServiceHost has been opened

Кажется, что я попал в какой-то Catch 22, возможна ли функциональность, которую я ищу в WCF?

Спасибо

Mike

1 Ответ

3 голосов
/ 29 декабря 2010

Чтобы добавить инспектор сообщений к конечной точке службы, это должно быть сделано путем реализации либо IServiceBehavior, либо IEndpointBehavior. В случае ServiceBehavior, который я в итоге использовал, я поместил приведенный выше код в метод ApplyDispatch () IServiceBehavior. Затем я обязательно добавил поведение в свой ServiceHost, хотя я мог бы сделать это с помощью конфигурации, создав BehaviorExtensionElement.

...