Это на .Net 4, полный фреймворк.
Я пытаюсь создать простое приложение winforms, которое будет делать несколько простых вызовов WCF REST.Он использует ChannelFactory и интерфейс контракта на обслуживание.Из ~ 20 методов в интерфейсе 2 из них включают Stream (метод загрузки и выгрузки), поэтому сторона обслуживания (и в настоящее время также сторона клиента) использует TransferMode = Streamed.
Моя цель - включитьполный HTTP-запрос и ответ (так же, как вы могли бы видеть в ethereal / wireshark, или fiddler, или где-либо еще) с заголовками в текстовом поле приложения winforms (просто чтобы показать, что произошло по сети)
При попытке использовать встроенную диагностику (через SvcConfigEditor) и мою собственную (через реализацию IClientMessageInspector и затем IEndpointBehavior для добавления инспектора, затем channelFactory.Endpoint.Behaviors.Add, чтобы добавить поведение :), у меня есть 2 проблемы:
- При выполнении request.ToString () или reply.ToString () в BeforeSendRequest и AfterReceiveReply он получает только «тело», а не заголовки.Перебирая объекты в отладчике, он выглядит так, как будто в ответе они есть в response.Properties ["httpResponse"], но запрос request.Properties ["httpRequest"] имеет пустое свойство Headers, хотя Fiddler показывает заголовки для Content-Type., Host, Accept-Encoding и Connection.Кажется, что есть лучший способ получить «сырое» сообщение, которое я пропускаю (а если нет, кто-то, вероятно, знает существующий кусок кода, чтобы «реконструировать» необработанный код из сообщения)
- Поскольку режим передачи - 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 в виде потока.
Спасибо!