2012-02-02 17 views
6

Questo è il nostro piano d'azione (che non è negoziabile):trasparente GZIP decompressione dei POST dati per WCF Resto Servizio

  • WCF REST Servizio esposto su HTTP utilizzando WebHttpEndpoint ospitato in IIS7
  • Tutte le risposte ei dati richiesta POST trasmesso come JSON
  • Client Web non WCF
  • Abbiamo attivato la compressione gzip per le risposte JSON in IIS7 che funziona correttamente.

Dal momento che stiamo facendo richieste POST con carichi utili JSON più grandi abbiamo implementato lato client compressione GZIP per i dati post-JSON e l'impostazione del "Content-Encoding" a "gzip". Sfortunatamente IIS non gestisce questo fuori dalla scatola. I dati del post raggiungono il deserializzatore della WCF in forma compressa, il che ovviamente genera un'eccezione.

Ho provato vari punti di estensione a collegarsi alla pipeline WCF ma l'unica soluzione promettente (Operation Behavior) non ha funzionato perché in assenza di un client WCF, il metodo ApplyClientBehavior dell'interfaccia IOperationBehavior non verrà mai chiamato.

Alla fine, se implementato un HttpModule che ottiene il lavoro fatto, ma io non sono esattamente contento del risultato a causa dei seguenti avvertenze:

  • Anche se sono in grado di decomprimere in modo trasparente i dati della richiesta impostando la proprietà Filter dell'attuale HttpRequest a GZipInputStream è solo metà della soluzione perché WCF insiste sulla lettura esatta dei byte HttpRequest.ContentLength dalla richiesta che per le richieste compresse sarà ovviamente molto inferiore al payload non compresso
  • Per qualche strano motivo oltre la mia immaginazione Microsoft ha bloccato ogni modo legale per modificare ContentLength del r equest. Alla fine ho dovuto modificare il campo di backing privato per la proprietà ContentLength della richiesta. Quale non è qualcosa che vuoi fare nel codice di produzione.
  • Microsoft ha inoltre reso impossibile la lettura della richiesta InputStream in HttpModule di capire la lunghezza del contenuto non compresso che ha richiesto il nostro client web di passare anche un header personalizzato che contiene la lunghezza del contenuto non compresso

Tutto sommato, questo si sente come un sacco di lavoro che non potrebbe nemmeno essere implementato in modo pulito quindi vorrei sapere se qualcuno può indicare alternative all'implementazione della parte di decompressione in IIS. Sto assolutamente bene con le raccomandazioni per un prodotto commerciale che fa questo se ce n'è uno.

+0

Hai trovato una soluzione per questo? – Snowy

+0

Qualcuno ha trovato una soluzione a questo? –

+0

Non sembra esserci una soluzione nota. –

risposta

0

penso che si dovrebbe essere in grado di fare questo con un service side Message inspector

decomprimere in AfterReceiveRequest

+0

Un ispettore messaggi di spedizione viene eseguito troppo tardi nella pipeline, purtroppo. L'ho già provato e il messaggio passato all'ispettore è già in stato di errore. –

+0

Hai guardato usando il codificatore GZip nel tuo endpoint sul lato del servizio http://msdn.microsoft.com/en-us/library/cc138373(v=VS.90).aspx o almeno una versione che decodifica GZip ma codifica normalmente –

Problemi correlati