WCF OperationContext

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

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

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

1 ответ

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

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

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

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

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

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

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

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

Марк

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