我编写了一个 HttpModule,我用它来拦截对 WebResource.axd 处理程序的调用,这样我就可以对 javascript 执行一些后期处理。
该模块包装 Response.Filter 流以执行其处理并将其更改写入基础流。
我遇到的问题是脚本没有返回给浏览器。
作为一个非常简单的例子,只是作为一个传递,模块看起来像这样:
public class ResourceModule : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.PostRequestHandlerExecute += new EventHandler(context_PostRequestHandlerExecute);
}
void context_PostRequestHandlerExecute(object sender, EventArgs e)
{
HttpApplication context = sender as HttpApplication;
if (context.Request.Url.ToString().Contains("WebResource.axd"))
{
context.Response.Filter = new ResourceFilter(context.Response.Filter);
}
}
}
ResourceFilter 只输出它接收到的内容,如下所示:
public class ResourceFilter : MemoryStream
{
private Stream inner;
public ResourceFilter(Stream inner)
{
this.inner = inner;
}
public override void Write(byte[] buffer, int offset, int count)
{
inner.Write(buffer, offset, count);
}
}
我可以附加并查看正在调用的模块和过滤器,但是当我浏览到 WebResource.axd url 时,我什么也得不到。
我已经使用这种模式实现了在 aspx 页面上执行处理的模块,它们工作得很好。似乎与 WebResource.axd 的交互有一些问题阻止了此工作。
最佳答案
我做了一个小项目并准确地重现了你的问题。我正在运行 fiddler 以仔细查看响应,包括 header ,发现它仅在发生这种情况的 *.axd 文件上的过滤器上。
经过一番搜索,我找到了 this Daniel Richardson 的文章也有同样的问题。
事实证明,System.Web.Handlers.AssemblyResourceLoader
(axds 通过)设置了一个标志以忽略进一步的写入。
Daniel 给出了一个使用反射取消设置此标志并允许您的过滤器处理 axd 的结果的示例。我试过了,效果很好。不过,最好记住这对性能的任何影响,正如 Daniel 所说,ASP.NET 实现可能会发生变化。
关于c# - HttpResponse 过滤器不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1292831/