HttpResponsefilter什么都不返回
我编写了一个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); } }
我可以附加并查看被调用的模块和filter,但是当我浏览到WebResource.axd时,我什么也得不到。
我已经使用这个模式来实现在aspx页面上执行处理的模块,它们工作得很好。 似乎与WebResource.axd的交互有一些阻止这种工作的东西。
我做了一个小项目并完全重新创建了你的问题。 我正在运行小提琴,以便好好看看响应,包括标题,发现它只发生在* .axd文件的filter上。
经过一番搜索,我发现Daniel Richardson的这篇文章有同样的问题。
事实certificate, System.Web.Handlers.AssemblyResourceLoader
(axds经历)设置一个标志来忽略进一步的写入。
Daniel给出了一个使用reflection来取消设置此标志的示例,并允许您的filter处理axd的结果。 我试了一下,效果很好。 最好记住这对性能的影响,正如Daniel所说,ASP.NET实现可能会改变。
根据我的经验,filter最迟需要在PreRequestHandlerExecute事件中“挂钩”,以使其在早于版本7的IIS版本中运行。
- iTextSharp打印gridview
- 如何阻止asp.net阻止对文件的访问,然后在构建时抛出访问被拒绝的错误?
- SSRS报告在IE9中被剪辑,但在IE8中很好
- 如何在c#中按两列对DataTable进行排序
- ASP.NET Web API – 没有“MediaTypeFormatter”可用于读取“Int32”类型的对象
- ASP.Net MVC应用程序中的线程安全全局变量
- 为什么没有asp.net 5.0预览的身份validation – web api模板 –
- 我可以使用reflection来查找ASP.NET中的bin / 文件夹而不是asp临时文件夹
- 如何在单击按钮时检查gridview列中复选框的状态