HttpResponse 过滤器不返回任何内容

2024-05-05

我编写了一个 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 来仔细查看响应(包括标头),发现仅在 *.axd 文件的过滤器上发生了这种情况。

经过一番搜索我发现this http://daniel-richardson.blogspot.com/2008/11/how-to-apply-filter-to-content-returned.htmlDaniel Richardson 的文章也有同样的问题。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HttpResponse 过滤器不返回任何内容 的相关文章

随机推荐