2009-09-09 12 views
7

Mam usługę REST, która zwraca dużą porcję XML, o wartości około 150 000.Kompresja WCF REST

np. http://xmlservice.com/services/RestService.svc/GetLargeXML

Dlatego chcę skompresować odpowiedź z serwera, ponieważ GZIP powinien zmniejszyć to do czegoś znacznie mniejszego. Po przeszukaniu wszędzie, gdzie nie mogę, na całe życie, znajduję przykład, jak wykonać kompresję dla usług WCF REST. Wsparcie!!

UWAGA: Moja usługa jest hostowana przez firmę zewnętrzną i NIE MOŻNA tego zrobić za pośrednictwem usług IIS, ponieważ nie jest przez nią obsługiwana.

Odpowiedz

-1

Oto link, który może być przydatny:

WS-Compression for WCF

Przynajmniej, należy umieścić na właściwym torze.

+2

Dzięki, ale niestety jest to rozwiązanie WS (SOAP), a nie REST (webHttp). – PhilJ

-2

Najprostszym sposobem byłoby użycie filtra kompresji PLJ przed serwletem.

PJL Compression Filter

To wygląda na Accept-Encoding nagłówka HTTP w celu ustalenia, czy klient może zaakceptować skompresowany odpowiedzi. Zasadniczo po prostu zamyka ServletOutputStream w GZipOutputStream lub DeflateerOutputStream - całkiem proste i użyteczne.

+0

To jest usługa WCF działająca w usługach IIS, więc filtr serwletów J2EE nie jest oczywiście opcją. – PhilJ

+0

Mój zły, nie miał pojęcia, czym był WCF - doszedłem do wniosku, że był to inny framework Java-esque. – Gandalf

6

To jest rzeczywiście bardzo łatwo to zrobić, przynajmniej z .NET 4.0 (nie testowałem z 3.5). Po prostu pozwól IIS 7 zająć się tym. Nie ma potrzeby tworzenia niestandardowego filtru kompresji.

Najpierw upewnij się, że masz zainstalowaną funkcję dynamicznej kompresji dla usług IIS 7. Następnie wybierz serwer w Menedżerze usług IIS i użyj modułu kompresji, aby włączyć kompresję dynamiczną. Możesz to również zrobić z wiersza poleceń:

C:\windows\system32\inetsrv\appcmd set config -section:urlCompression /doDynamicCompression:true 

Następnie edytuj następujący plik. Być może będziesz musiał zrobić kopię, zamiast bezpośrednio edytować konfigurację (Notepad ++ narzeka na mnie), a następnie nadpisać oryginał, gdy będziesz gotowy.

C:\Windows\System32\Inetsrv\Config\applicationHost.config 

Tam znajdziesz <dynamicTypes> sekcję pod <httpCompression>. Pod <dynamicTypes> będziesz musiał dodać wszystkie typy mime, które chcesz skompresować, gdy klient wyśle ​​nagłówek Accept-Encoding: gzip. Na przykład:

<dynamicTypes> 
    <add mimeType="text/*" enabled="true" /> 
    <add mimeType="application/xml" enabled="true" /> 
    <add mimeType="application/json" enabled="true" /> 
    <add mimeType="message/*" enabled="true" /> 
    <add mimeType="application/x-javascript" enabled="true" /> 
    <add mimeType="*/*" enabled="false" /> 
</dynamicTypes> 

Po wykonaniu tych czynności należy poddać recyklingowi pulę aplikacji i powinieneś być gotowy. Jeśli to nie pomoże, spróbuj ponownie uruchomić serwer i upewnij się, że kompresja dynamiczna jest włączona na poziomie aplikacji i na poziomie serwera.

Uwaga: Według niektórych postów, które czytałem, był błąd, w którym trzeba było określić kodowanie znaków (np. "Application/json; charset = utf-8"). Jednak nie miałem żadnych problemów.

+1

To samo można zrobić za pomocą web.config, co jest wygodniejsze: http://codeasp.net/blogs/raghav_khunger/microsoft-net/1973/asp-net-enable-gzip-compression-via-web-config –

Powiązane problemy