WCF OperationContext - PullRequest
       32

WCF OperationContext

1 голос
/ 01 августа 2009

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

Сначала я думал, что я сохраню сериализованный параметр в OperationContext.IncomingMessageProperties, чтобы получить к нему доступ из метода HandleError. Однако, поскольку это не выполняется в исходном потоке, я считаю, что OperationContext будет нулевым, поэтому я рассматриваю доступ к нему из метода ProvideFault.

Это кажется возможным? И будет ли он работать с сервисными вызовами OneWay?

1 Ответ

2 голосов
/ 02 августа 2009

Не уверен, что могу вам здесь сильно помочь, но позвольте мне попробовать:

на вашем клиенте ваш код в основном вызывает метод и передает ему параметры. Затем стек WCF на стороне клиента преобразует его в сообщение SOAP (обычно с телом XML, но может быть и двоичным) с заголовками и всем, а затем отправляет это сообщение по проводам на сервер для обработки.

Затем сервер пытается десериализовать это сообщение в объект и пытается вызвать сообщение на объекте реализации сервера. Этот метод на объекте сервера, скорее всего, снова будет иметь те же параметры, что и клиент, - однако существует вероятность, что вызов завершится неудачно, прежде чем этот метод даже будет вызван.

Итак, я пытаюсь сказать: вы не можете полагаться на тот факт, что ваш серверный метод с его параметрами действительно вызывается - возможно, была проблема с, например, аутентификация, формат сообщения, отсутствующий заголовок или что-то еще, что приводит к сбою на стороне сервера и выдаче исключения даже до того, как метод на стороне сервера когда-либо будет вызван.

В конце концов, в IErrorHandler я не знаю, как получить сообщение и / или метод и его параметры - все, что вы можете получить - это ошибка, произошедшая на сервере, и вы можете используйте это, чтобы превратить его в ошибку SOAP.

Что вы могли бы сделать - как на стороне клиента, так и на стороне сервера - это создать новое поведение, которое подключается к стеку WCF и записывает вызываемые методы и передаваемые в них параметры - путем реализации класса, реализующего IParameterInspector интерфейс WCF. Но это будет вызвано только в том случае, если сообщение на клиенте и сервере будет десериализовано должным образом, а метод на стороне сервера действительно будет вызван.

Проверьте некоторые из этих ссылок для получения дополнительной информации о расширяемости WCF:

Надеюсь, это немного поможет!

Марк

...