使用另一个HttpHandler拦截默认处理程序的输出

时间:2011-03-18 22:57:34

标签: asp.net filter httphandler

我为HttpHandler设置*css来做一些简单的解析:

    <handlers>
        <add name="CssHandler" verb="*" path="*.css" 
           type="MyApp.CssProcessor,MyApp.Assembly"/>
    </handlers>

一切都很好,直到我添加了一个动态加载css文件的资源,例如

<link rel="stylesheet" type="text/css" href="/loader.ashx/module.resource.css" >

令我惊讶的是,事情发生了可怕的错误。自定义http处理程序拦截了这个,但由于它只是从文件系统加载文件,它不起作用。我意识到,从技术上讲,它匹配模式*.css,但这似乎是一种奇怪的行为,因为从Web服务器请求的实际资源是*.ashx而css仅在文件路径之后,作为参数。

是否可以使处理程序的过滤器仅适用于实际的服务器资源名称?

或者(实际上我想知道如何做到这一点) - 我真正宁愿做的是拦截默认的css处理程序的输出。也就是说,不是让我自己的代码实际从我的CSS处理程序中的文件系统加载文件,似乎只需从默认处理程序中获取响应并过滤它就会简单得多。在这种情况下哪种方法可以正常工作。

最后,在任何一种情况下,我更倾向于过滤资源MIME类型text/css而不是按名称拦截请求,因为我真正想要做的是过滤任何CSS(而不是发生的任何事情)被命名为“* .css”)。有关如何做到这一点的任何指示?

1 个答案:

答案 0 :(得分:0)

你可以...... 1)修改处理程序以检查文件是否存在。 2)使用HttpModule拦截响应。不确定你在这种情况下究竟在做什么,但实际修改输出可能会变得棘手。 3)修改传递给loader.ashx的参数不以.css结尾(这有点hacky) 4)尝试使用“?”作为loader.ashx和参数之间的分隔符,因为还有其他请求(.axd)经常使用查询字符串参数并且仍能正常工作。