C# HttpResponse筛选器不返回任何内容

C# HttpResponse筛选器不返回任何内容,c#,asp.net,filter,httpmodule,C#,Asp.net,Filter,Httpmodule,我已经编写了一个HttpModule,用于拦截WebResource.axd处理程序的调用,以便对javascript执行一些后期处理 模块包装Response.Filter流以执行其处理,并将其更改写入基础流 我遇到的问题是脚本没有返回到浏览器 因此,作为一个非常简单的示例,它只是作为一个传递,模块如下所示: public class ResourceModule : IHttpModule { public void Dispose() { } publi

我已经编写了一个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);
        }
    }
}
 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);
    }
}
仅输出接收内容的ResourceFilter如下所示:

 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);
        }
    }
}
 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文件的过滤器上

经过一番搜索,我找到了丹尼尔·理查森的文章,他也有同样的问题

事实证明,
System.Web.Handlers.AssemblyResourceLoader
(axds所使用的)设置了一个忽略进一步写入的标志


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

根据我的经验,过滤器最迟需要在PreRequestHandlerExecute事件中“挂接”,以使其在早于版本7的IIS版本中工作。

如果有人对将标志设置为false的代码感兴趣:
FieldInfo field=\u webStream.GetType().BaseType.GetField(“\u writer”,BindingFlags.NonPublic | BindingFlags.Instance)
var writer=field.GetValue(_webStream)
FieldInfo ignoringWrites=writer.GetType().GetField(“_ignoringFurtherWrites”,BindingFlags.NonPublic | BindingFlags.Instance)
ignoringWrites.SetValue(writer,false)