HttpResponse过滤器什么都不返回

4 c# asp.net filter httpmodule

我编写了一个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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并且只输出它收到的资源的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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以附加并查看被调用的模块和过滤器,但是当我浏览到WebResource.axd时,我什么也得不到.

我已经使用这种模式来实现在aspx页面上执行处理的模块,它们工作得很好.似乎与WebResource.axd的交互有一些阻止这种工作的东西.

小智 5

我做了一个小项目并完全重新创建了你的问题.我正在运行fiddler来仔细查看响应,包括标题,发现它只发生在*.axd文件的过滤器上.

经过一番搜索后,我发现Daniel Richardson的这篇文章有同样的问题.

事实证明System.Web.Handlers.AssemblyResourceLoader(轴经过)设置一个标志来忽略进一步的写入.

Daniel给出了一个使用反射取消设置此标志的示例,并允许您的过滤器处理axd的结果.我试了一下,效果很好.最好记住这对性能的影响,正如Daniel所说,ASP.NET实现可能会改变.