Прозрачная GZIP-декомпрессия POST-данных для WCF Rest Service - PullRequest
6 голосов
/ 02 февраля 2012

Это наш сценарий (который не подлежит обсуждению):

  • Служба REST WCF, предоставляемая через HTTP с использованием WebHttpEndpoint, размещенной в IIS7
  • Все данные ответов и запросы POST передаются в виде JSON
  • Веб-клиент, отличный от WCF
  • Мы включили сжатие gzip для ответов JSON в IIS7, что прекрасно работает.

Поскольку мы выполняем почтовые запросы с большими полезными нагрузками JSON, мы реализовали сжатие GZIP на стороне клиента для данных почты JSON и установили заголовок «Content-Encoding» равным «gzip».К сожалению, IIS не справляется с этим из коробки.Почтовые данные поступают в десериализатор WCF в сжатом виде, что, конечно, приводит к исключению.

Я пробовал различные точки расширения для подключения к конвейеру WCF, но единственное многообещающее решение (Operation Behavior) не сработало, потому что в отсутствие клиента WCF метод ApplyClientBehavior интерфейса IOperationBehavior никогда не будетзвонил.

В конце концов, если реализован HttpModule, который выполняет работу, но я не совсем доволен результатом из-за следующих предостережений:

  • Хотя я могупрозрачно распаковать данные запроса, установив для свойства Filter текущего HttpRequest значение GZipInputStream, которое является только половиной решения, потому что WCF настаивает на чтении именно байтов HttpRequest.ContentLength из запроса, который для сжатых запросов, очевидно, будет значительно меньше несжатой полезной нагрузки1020 *
  • По какой-то странной причине, за пределами моего воображения, Microsoft заблокировала все законные способы изменить ContentLength запроса.В конце концов мне пришлось изменить частное вспомогательное поле для свойства ContentLength запроса.Это не то, что вы хотите сделать в производственном коде.
  • Microsoft также сделала невозможным чтение запроса InputStream в HttpModule, чтобы выяснить длину несжатого содержимого, что требовало от нашего веб-клиента также передавать пользовательский заголовок, содержащийдлина несжатого контента

В целом это похоже на огромную работу, которую невозможно выполнить даже чисто, поэтому я хотел бы знать, может ли кто-нибудь указать альтернативные варианты реализации декомпрессионной части в IIS,Я абсолютно согласен с рекомендациями для коммерческого продукта, который делает это, если таковой имеется.

1 Ответ

0 голосов
/ 02 февраля 2012

Я думаю, что вы сможете сделать это с помощью инспектора сообщений на стороне службы

Распаковать в AfterReceiveRequest

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