我编写了一个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时,我什么也得不回来。
我已经使用这种模式来实现在aspx页面上执行处理的模块,它们工作得很好。似乎有一些与WebResource.axd的交互阻止了这种工作。
答案 0 :(得分:5)
我做了一个小项目并完全重新创建了你的问题。我正在运行小提琴手来仔细查看响应,包括标题,发现它只发生在* .axd文件的过滤器上。
经过一番搜索,我找到了Daniel Richardson的this文章,他有同样的问题。
事实证明System.Web.Handlers.AssemblyResourceLoader
(裁判通过)设置一个标志以忽略进一步的写入。
Daniel给出了一个使用反射取消设置此标志的示例,并允许您的过滤器处理axd的结果。我试了一下,效果很好。最好记住这对性能的影响,正如Daniel所说,ASP.NET实现可能会改变。
答案 1 :(得分:1)
根据我的经验,过滤器最迟需要在PreRequestHandlerExecute事件中“挂钩”,以使其在早于版本7的IIS版本中工作。