我想扩展我的REST服务(使用WCF/webHttpBinding构建),以便客户端可以上传经过压缩的数据。我不确定要达到这个目的的最佳方式,但是我认为通过添加一个HTTP模块可以相当容易,该模块将在传入请求的Content-Encoding设置为gzip时解压缩数据。我可以使用HTTP模块更改传入HTTP请求的内容吗?
所以我创建了一个类从IHttpModule的导出具有以下实现:
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);
}
}
我看到的问题是,从来没有实际执行GZipStream减压。我已经确认传入的数据实际上是gzip'd(msg变量包含正确的数据)。我也尝试创建我自己的流类(TestFilterStream),并将其分配给app.Request.Filter,并且我确认了流类中没有成员实际上由ASP.NET调用。所以看起来好像虽然可以指定一个过滤器,但实际上并未使用该过滤器。
是不是实际使用了HttpApplication.Request.Filter?
你有没有尝试过设置'Request.Filter'没有你的其他调试代码?这可能是因为您已经阅读了请求流,因此它不会再应用此过滤器。 –
我相信没有理由相信Request.InputStream是可搜索的。它可能不是。尝试删除你的调试代码,它可能是错误的(你可能必须关闭/冲洗decompressedStream才能真正写入内存流)。 – Luaan
请缩小这个问题的范围,因为从您的问题中不清楚实际发生的错误以及何时发生。问题实际上'GZipStream'没有读取底层流? 'contentEncoding'等于''gzip“','if'块中的代码被调用了吗?您是否尝试过记录此方法被调用的时刻?你甚至确定你的模块被加载了吗? – CodeCaster