您的位置:首页 > Web前端 > HTML

.html 映射到.net托管(用于实现页面伪静态)

2010-09-20 16:55 471 查看
IIS配置.html的映射问题,其实这个问题可以说是HttpHandlerFactory的在web.config中注册的问题

问题描述:
一套网站程序使用URL重写,配置了ISAPI映射.html 动作全部,检查文件是否存在 不打勾 如下图



限制为:GET,HEAD,POST,DEBUG

问题: 不对IIS配置.html的映射,IIS站点目录下.html页面都能显示。当配置了.html的映射 IIS站点目录下真实存在的.html页面无法显示,错误信息:“页面无法显示”而通过自定义HttpHandlerFactory块过滤的.html文件能够显示,由于这个原因就连FCKEditor也无法正常显示。

这个问题困扰了半天,极度郁闷, 在网上找了好久,也没有个办法,有一个和我一样的问题,但上面说的解决方法却不好用,更是郁闷,后来经过n次的测试修改,才把这个问题解决了,解决方法:
1、首先照旧在网站配置的应用程序扩展名映射中添加扩展名.html映射到aspnet_isapi.dll,是否存在不选;
2、在web.config文件中<compilation>节点下添加code:

<buildProviders>
<add extension=".html" type="System.Web.Compilation.PageBuildProvider" />
</buildProviders>
注:仅仅设置应用程序映射是不够的,没有为扩展名“.html”注册的生成提供程序。因此别忘了上面的code!

3、在web.config文件中<system.web>节点下添加code:
<httpHandlers>
<add path="*.html" verb="*" type="System.Web.UI.PageHandlerFactory" validate="true"/>
</httpHandlers>

注:这里值得注意的是add的先后顺序,很简单的原理,通过这个配置文件请求首先要到我们自定义的httpHandler块,如果不在我们指定的path里,则走系统的PageHandlerFactory; 还有一个要注意的地方就是,这里当

<add path="html/*.html" verb="*" type="AutoModuleService.AutoHandlerFactory,AutoModuleService" validate="true"/>
指明路径后,并不像下级目录继承,也就是当用户浏览html/vip/index.html时,被系统的System.Web.UI.PageHandlerFactory正常处理;如果需要继承指明路径下包括下级目录所有*.html的话,则就需要做些修改了

修改方法:

上面的1和2照做;

3、在web.config文件中<system.web>节点下添加code:

<httpHandlers>
<add path="*.html" verb="*" type="System.Web.UI.PageHandlerFactory" validate="true"/>
</httpHandlers>

4、在web.config文件中<configuration>节点下使用<location>节点,添加code:

<location path ="html">

<system.web>
<httpHandlers>
<add path="*.html" verb="*" type="AutoModuleService.AutoHandlerFactory,AutoModuleService" validate="true"/>



<add type="SearchWeb.HttpModule,SearchWeb" name="HttpModule"/>
</httpHandlers>

</system.web>

</location>

最后补充两点:
如果你用到的后缀类型是一种古怪的后缀。
比如:*.aaa *.csdn 等这样的后缀,
在IIS6 中,你需要额外再多做一步:
在IIS的站点属性->HTTP头->MIME类型中增加一个该后缀的MIME类型,不然遇到该后缀的请求时将首先被IIS给拦截掉,没办法显示的。

HttpModule.cs 伪静态类:

namespace SearchWeb
{
public class HttpModule : System.Web.IHttpModule
{
/// <summary>
/// 实现接口的Init方法
/// </summary>
/// <param name="context"></param>
public void Init(HttpApplication context)
{
context.BeginRequest += new EventHandler(this.context_BeginRequest);
}

/// <summary>
/// 实现接口的Dispose方法
/// </summary>
public void Dispose()
{

}

private void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;
string requestPath = context.Request.Path.ToLower();
MatchCollection matches;
//MatchCollection matches1;

string fileType = System.Configuration.ConfigurationManager.AppSettings["fileType"];

if (new Regex(@"/news/[/d]+." + fileType).IsMatch(requestPath))
{
// "具体某条新闻页";
matches = new Regex(@"/news/([/d]+)." + fileType).Matches(requestPath);
context.RewritePath("/NewsDetail.aspx?nid=" + matches[0].Groups[1].ToString());
return;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: