c# - HttpResponse 过滤器不返回任何内容

标签 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);
        }
    }
}

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/

相关文章:

jquery - .ajax 帖子上出现 401 未经授权

c# - 一个 Web API Controller 中具有不同参数的两种 HTTP Post 方法

javascript - Node.js:为 exec() 清理不受信任的用户输入

java - 在服务器根目录中运行 servlet 应用程序

c# - 如何在 AppDomain.Unload(domain) 之后删除 pluginassembly

C# 使用库 - 从源代码编译?真的吗?

c# - 一个对象怎么能不和null比较呢?

c# - 在不将所有元素复制到新数组的情况下裁剪字符串数组中的第一个元素

带有 IronRuby 的 ASP.net MVC?

c++ - 根据内核/掩码有效地迭代相关的相邻像素