2012-02-02 24 views
6

To jest nasz scenariusz (co nie jest do negocjacji):Transparent GZIP dekompresja danych post przez WCF Rest Służby

  • WCF REST Usługi wystawiony przez HTTP za pomocą WebHttpEndpoint gospodarzem w IIS7
  • Wszystkie odpowiedzi i POST żądania danych przesyłane jako JSON
  • Klient WWW spoza WCF
  • Włączyliśmy kompresję gzip dla odpowiedzi JSON w IIS7, który działa dobrze.

Ponieważ robimy żądania POST z większych ładunków JSON mamy wdrożone kompresji GZIP po stronie klienta dla danych JSON pocztowych i ustawienie „Content-Encoding” nagłówek „gzip”. Niestety IIS nie radzi sobie z tym po wyjęciu z pudełka. Dane post docierają do deserializatora WCF w skompresowanej formie, co oczywiście powoduje wyjątek.

Próbowałem różnych punktów rozszerzenia, aby podłączyć do potoku WCF, ale jedyne obiecujące rozwiązanie (Operation Behavior) nie działało, ponieważ w przypadku braku klienta WCF, metoda ApplyClientBehavior interfejsu IOperationBehavior nigdy nie zostanie wywołana.

W końcu jeśli wdrożony HttpModule, który dostaje zadanie, ale nie jestem dokładnie zadowolony z wyniku, ponieważ z następujących zastrzeżeń:

  • choć jestem w stanie przejrzyście dekompresji danych żądania przez ustawienie właściwość Filter bieżącego HttpRequest do GZipInputStream, który jest tylko połową rozwiązania, ponieważ WCF nalega na dokładne odczytanie bajtów HttpRequest.ContentLength z żądania, które w przypadku skompresowanych żądań będzie oczywiście znacznie mniejsze niż nieskompresowany ładunek
  • Z jakiegoś dziwnego powodu poza moja wyobraźnia Microsoft zablokował każdy legalny sposób na zmianę długości treści r equest. W końcu musiałem zmodyfikować prywatne pole zaplecza dla właściwości ContentLength żądania. Które nie jest czymś, co chcesz zrobić w kodzie produkcyjnym.
  • Microsoft udostępnił także niemożliwym do zapoznania się z InputStream życzenie w HttpModule, aby dowiedzieć się nieskompresowany długość treści, które wymagane klientowi internetowej, aby również przekazać niestandardowy nagłówek zawierający nieobciążonej długości zawartości

W sumie Odczuwalna strasznie dużo pracy, której nie można było nawet wdrożyć w sposób czysty, więc chciałbym wiedzieć, czy ktoś może wskazać alternatywy dla implementacji części dekompresyjnej w IIS. Mam absolutną rację z zaleceniami dotyczącymi komercyjnego produktu, który to robi, jeśli taki istnieje.

+0

Czy znaleźć rozwiązanie dla tego? – Snowy

+0

Czy ktoś znalazł rozwiązanie tego problemu? –

+0

Nie wydaje się, aby znane rozwiązanie. –

Odpowiedz

0

Myślę, że powinieneś być w stanie zrobić to z service side Message inspector

rozpakowywane w AfterReceiveRequest

+0

Inspektor komunikatów wysyłkowych wykonywany jest niestety zbyt późno. Próbowałem już tego i wiadomość przekazana inspektorowi jest już w błędzie. –

+0

Czy przyjrzeliście się używaniu enkodera GZip w punkcie końcowym po stronie usługi http://msdn.microsoft.com/en-us/library/cc138373(v=VS.90).aspx Lub przynajmniej wersja, która dekoduje GZip ale koduje normalnie –