为了让我们编写的符合W3C标准的网站精确地服务于客户,我们常常需要根据客户使用的浏览器代理类型向客户发送不同的Content-Type类型。要做到这一点,方案有多种。比较简单的是在页面逻辑中判断客户代理的支持类型,然后发送。可是因为这种方案需要在每一个页中都进行这样的判断,这简单也不过是“所谓的”简单罢了。从微软的技术文章中,我找到了一个解决方案,就是使用HttpModule技术。微软的文章里建议在Application的PreSendRequestHeaders事件处理程序中进行这样的处理,但是经过实践,这并不好用:虽然发送到客户端的Header的确是按照预先的处理进行的,可是如果要使用Response.ContentType自定义aspx文件中的<meta />(即使用<
meta
http-equiv=
"Content-Type"
content=
"<%= Response.ContentType
%>; charset=utf-8"
/>)根本做不到,页面中仍然使用默认的text/html作为ContentType。
于是我把对ContentType的处理提前,放到Application的PreRequestHandlerExecute事件处理程序中,于是一切搞定!
下面是该部分程序的源代码。
为了减少朋友们重复开发,我把整个模块的源代码以及DLL文件上传到了 我的资源里,朋友们可以放心使用。
【使用方法】
1)在web.config文件中添加如下指令:
<httpModules>
<add type="RedFishX.Web.W3CPractice.Modules.ContentTypeNegotiationModule, RedFishX.Web.W3CPractice.Modules" name="ContentTypeNegotiationModule" />
</httpModules>
2)把DLL文件复制到bin目录,搞定。
于是我把对ContentType的处理提前,放到Application的PreRequestHandlerExecute事件处理程序中,于是一切搞定!
下面是该部分程序的源代码。
class
ContentTypeNegotiationModule : System.Web.IHttpModule
{
public ContentTypeNegotiationModule()
{
}
IHttpModule 成员
Application Events handlers
}
{
public ContentTypeNegotiationModule()
{
}
IHttpModule 成员
Application Events handlers
}
为了减少朋友们重复开发,我把整个模块的源代码以及DLL文件上传到了 我的资源里,朋友们可以放心使用。
【使用方法】
1)在web.config文件中添加如下指令:
<httpModules>
<add type="RedFishX.Web.W3CPractice.Modules.ContentTypeNegotiationModule, RedFishX.Web.W3CPractice.Modules" name="ContentTypeNegotiationModule" />
</httpModules>
2)把DLL文件复制到bin目录,搞定。