REST-клиент WCF с TransferMode = Streamed - ведение журнала целых («сырых») http-запросов / ответов - PullRequest
1 голос
/ 18 июля 2010

Это на .Net 4, полный фреймворк.

Я пытаюсь создать простое приложение winforms, которое будет делать несколько простых вызовов WCF REST.Он использует ChannelFactory и интерфейс контракта на обслуживание.Из ~ 20 методов в интерфейсе 2 из них включают Stream (метод загрузки и выгрузки), поэтому сторона обслуживания (и в настоящее время также сторона клиента) использует TransferMode = Streamed.

Моя цель - включитьполный HTTP-запрос и ответ (так же, как вы могли бы видеть в ethereal / wireshark, или fiddler, или где-либо еще) с заголовками в текстовом поле приложения winforms (просто чтобы показать, что произошло по сети)

При попытке использовать встроенную диагностику (через SvcConfigEditor) и мою собственную (через реализацию IClientMessageInspector и затем IEndpointBehavior для добавления инспектора, затем channelFactory.Endpoint.Behaviors.Add, чтобы добавить поведение :), у меня есть 2 проблемы:

  1. При выполнении request.ToString () или reply.ToString () в BeforeSendRequest и AfterReceiveReply он получает только «тело», а не заголовки.Перебирая объекты в отладчике, он выглядит так, как будто в ответе они есть в response.Properties ["httpResponse"], но запрос request.Properties ["httpRequest"] имеет пустое свойство Headers, хотя Fiddler показывает заголовки для Content-Type., Host, Accept-Encoding и Connection.Кажется, что есть лучший способ получить «сырое» сообщение, которое я пропускаю (а если нет, кто-то, вероятно, знает существующий кусок кода, чтобы «реконструировать» необработанный код из сообщения)
  2. Поскольку режим передачи - Streamed, часть 'body' просто отображается как строка '... stream ...', как в SvcTraceViewer (и в 'raw' svclog - даже с logEntireMessage = true), так и при выполненииНанизывать().Если вместо этого выбран режим Buffered, он показывает фактическое тело в порядке.Я попытался сделать копию с reply.CreateBufferedCopy (int.MaxValue);но это затем вызвало фактический сбой вызова WCF с InvalidOperationException: это сообщение не может поддерживать операцию, потому что она была скопирована.

Одним из возможных вариантов было бы переместить клиента в Buffered и просто изменить на StreamedRequestдля одного вызова загрузки и StreamedResponse для вызова загрузки (но я должен был бы сделать это программно AFAICT, так как он установлен на уровне привязки в конфигурации, и я не вижу возможности сделать это с помощью атрибутов в вызовах),который позаботился бы о части 'body' и оставил бы мне только "получить заголовки http-запроса" (проблема № 1, а именно request.Properties ["httpRequest"]. заголовки пустые), но янадеясь, что есть какой-то способ регистрации «сырых» сообщений без этого, оставляя TransferMode в виде потока.

Спасибо!

1 Ответ

1 голос
/ 19 июля 2010

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

Вот источник: Настройка ведения журнала сообщений на MSDN

Смотрите в конце страницы:

Уровень обслуживания

Сообщения, зарегистрированные на этом уровне, собирается войти (при получении) или уйти (при отправке) код пользователя. Если фильтры были определены только сообщения, которые Соответствующие фильтры вошли. В противном случае все сообщения на сервисе уровень зарегистрированы. инфраструктура сообщения (транзакции, одноранговый канал, и безопасность) тоже вошли уровень, за исключением надежного обмена сообщениями Сообщения. Только для потоковых сообщений заголовки записываются в журнал. Кроме того, безопасные сообщения регистрируются расшифрованы на этом уровне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...