Добавление инспекторов сообщений WCF во время выполнения

Я создал собственный 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?

Спасибо,

Майк

1 ответ

Решение

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

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