Sto cercando di estendere il mio servizio REST (creato usando WCF/webHttpBinding) in modo che i client possano caricare dati compressi con gzip. Non sono sicuro di quale sia il modo migliore per farlo, ma ho pensato che sarebbe stato abbastanza semplice aggiungendo un modulo HTTP che decomprimerà i dati se Content-Encoding per la richiesta in arrivo è impostato su gzip.Posso modificare il contenuto di una richiesta HTTP in arrivo utilizzando un modulo HTTP?
Così ho creato una classe derivante dalla IHttpModule con la seguente implementazione:
private void OnBeginRequest(object sender, EventArgs e)
{
var app = (HttpApplication) sender;
var context = app.Context;
var contentEncoding = context.Request.Headers["Content-Encoding"];
if (contentEncoding == "gzip")
{
// some debug code:
var decompressedStream = new GZipStream(context.Request.InputStream, CompressionMode.Decompress);
var memoryStream = new MemoryStream();
decompressedStream.CopyTo(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
var streamReader = new StreamReader(memoryStream);
string msg = streamReader.ReadToEnd();
context.Request.InputStream.Seek(0, SeekOrigin.Begin);
app.Request.Filter = //new TestFilterStream(app.Request.Filter);
new System.IO.Compression.GZipStream(
app.Request.Filter, CompressionMode.Decompress);
}
}
Il problema che sto vedendo è che la decompressione GZipStream non è mai effettivamente svolto. Ho confermato che i dati in arrivo sono in effetti gzip'd (la variabile msg contiene i dati corretti). Ho anche provato a creare la mia classe stream (TestFilterStream) sopra e assegnarla a app.Request.Filter e ho confermato che nessun membro della classe stream è effettivamente chiamato da ASP.NET. Quindi sembra che mentre è possibile specificare un filtro, quel filtro non sia effettivamente usato.
Non è effettivamente utilizzato HttpApplication.Request.Filter?
hai provato a impostare 'Request.Filter' senza il tuo altro codice di debug? Potrebbe essere che tu abbia già letto il flusso della richiesta in modo che non applichi più il filtro. –
Credo che non ci sia motivo di credere che Request.InputStream sia ricercabile. Probabilmente no. Prova a rimuovere il tuo codice di debug, probabilmente è comunque sbagliato (potresti dover chiudere/svuotare il decompressedStream prima che scriva veramente qualcosa nel flusso di memoria). – Luaan
Si prega di limitare il problema, in quanto non è chiaro dalla domanda in cui si è verificato l'errore effettivo e quando. In realtà il problema è che 'GZipStream' non legge il flusso sottostante? È 'contentEncoding' euqual a' "gzip" ', viene chiamato il codice nel blocco' if'? Hai provato a registrare nel momento in cui viene chiamato questo metodo? Sei sicuro che il tuo modulo venga caricato? – CodeCaster