mvc 路由 .html 404,部署ASP.NET的MVC网站到IIS 6.0中,发现路由无法解析而出现404错误解决方案...

部署ASP.NET MVC应用到IIS

6总是会引起混乱在第一。你已经编码在Visual Studio

2008中,看到你可爱干净的URL中内置的Web服务器很好地工作,你坚持了一些代码的Windows Server

2003的计算机上,然后重击!这一切都像404找不到和你像嘿伙计,这不是很酷。

图像

这是因为IIS

6中仅调用ASP.NET时,看到的是被映射为aspnet_isapi.dll

URL中的“文件扩展名”(这是负责ASP.NET调用一个C / C + +的ISAPI筛选器) 。由于路由是。NET

IHttpModule的所谓UrlRoutingModule

,它不会被调用,除非ASP.NET本身被调用时,被调用的aspnet_isapi.dll只发生,而只发生时,有一个的。aspx在URL中。所以,没有的。aspx

,没有UrlRoutingModule ,因此404 。

我说你已经得到了解决此四种方式:

选项1:使用通配符映射的aspnet_isapi.dll

这告诉IIS

6中使用ASP.NET来处理所有的请求,所以路由总是调用,而且也没有问题。它的死很容易设置:打开IIS管理器中,右键单击您的应用程序,选择属性,然后主目录选项卡,然后单击配置。在通配符应用程序映射,然后单击插入(不添加,这是容易混淆的正上方)

,然后输入C:\ WINDOWS \ Microsoft.NET \框架\ V2.0.50727 \

aspnet_isapi.dll的为“可执行文件” ,然后取消选中确认文件是否存在。

完成了!现在路由只是行为,因为它总是在VS2008内置的服务器一样。

不幸的是,这也告诉IIS使用ASP.NET提供的所有请求,包括对静态文件。它将工作,因为ASP.NET有一个内置的DefaultHttpHandler

,做它,但根据您的要求在做什么,它可能会使用StaticFileHandler服务请求。

StaticFileHandler比IIS本身效率低得多。你看,它总是从磁盘读取文件的每一个请求,不缓存在内存中。它不发送,你可能已经在IIS中配置的Cache-

Control头,那么浏览器将不缓存它正确。它没有做HTTP压缩。但是,如果你能避免与请求干扰,

DefaultHttpHandler将控制传递回IIS的本地处理,这是好多了。

对于小型的Intranet应用程序,通配符映射可能是最好的选择。是的,它的影响略有表现,但是这可能不是一个问题给你。也许你有更好的事情操心。

对于较大的公共互联网应用,你可能需要一个解决方案,提供更好的性能。

更新:原来,你可以禁用选定的子文件夹通配符映射,它可以给你最好的两个世界。

方案2 :将ASPX中所有的路由条目“ URL模式

如果你不介意在你的网址。 ASPX

,只是通过你的路由配置,添加的。aspx一个正斜杠在每个模式之前。例如,使用(控制器)的。aspx / {行动} / {

id}的或myapp.aspx / {控制器} / {行动} / {

id}的。不要把ASPX里面的大括号的参数名称,或进入“默认”值,因为它不是真正的控制器名称的一部分 -

它只是在URL中,以满足IIS。

现在,您的申请将被就像一个传统的ASP.NET应用程序调用。

IIS仍处理静态文件。这可能是在共享主机方案中最简单的解决方案。不幸的是,你已经宠坏了你,否则干净的URL模式。

选项​​3:使用在所有的URL模式的自定义文件扩展名

这是与上述相同,除了用类似的东西。

MVC代替甑。它并没有真正创造任何优势,不是炫耀你正在使用ASP.NET MVC等。

正如上文所述更新您的路由条目,除了投入的。aspx的。

MVC代替。接下来,注册一个新的ISAPI映射:打开IIS管理器中,右键单击您的应用程序,选择属性,然后主目录选项卡,然后单击配置。在映射选项卡,单击添加,然后输入C:

\ WINDOWS \ Microsoft.NET \框架\ V2.0.50727 \

aspnet_isapi.dll的为“可执行文件” , MVC (或任何你使用的扩展名)为“扩展”

,和取消选中确认文件是否存在。离开脚本引擎检查(除非你的应用程序有执行权限),并保留选中所有动词,除非你特别要过滤的HTTP方法。

这就是它 -

你现在使用的是自定义的扩展。不幸的是,它仍然是一个有点否则你干净的URL模式碍眼的。

选项4 :使用URL重写

这是一个技巧,使IIS认为有URL中的文件扩展名,即使没有。它的实施是最难解决方案,但只有一个,让完全干净的URL不会对性能有任何显著流失。

本Scheirman想出了关于这个问题的一个伟大的职位,但我适应的技术稍微以免无需以任何方式更改我的路由配置。下面是它的工作对我来说:

1

。作为扩展名的请求到达时,我们有一个第三方ISAPI筛选器重写添加已知延长期限的请求:甑。

2 。 IIS中看到的延伸,并将其映射为aspnet_isapi.dll

,因此在ASP.NET

3

。之前看到路由的要求,我们有一个的Application_BeginRequest (

)处理程序重写的URL回其原始的,无扩展名的形式

4 。路由看到扩展名的URL和正常的行为。

由于该URL被取消改写在步骤3中,你不必做任何事情好笑进行对外的URL生成工作。

该怎么办呢

首先,下载并安装赫利的下ISAPI_Rewrite

。您可以使用免费版本,版本2

,但要注意这会影响你的服务器上的所有网站。如果你需要重写定位到一个特定的应用程序或虚拟目录,你需要付费的版本之一。

现在编辑下ISAPI_Rewrite的配置(开始 - >所有程序

- >赫利 - >下ISAPI_Rewrite - >的httpd.ini ) ,并添加:

#如果你正在主持一个虚拟目录,使这些线路,

#进入你的虚拟目录的路径。

# UriMatchPrefix / myvirtdir

# UriFormatPrefix / myvirtdir

#将扩展到这个规则,以避免它们被由ASP.NET处理

( * ) ,重写规则\ (CSS | GIF | PNG | JPEG

| JPG | JS |邮编) 。 $ 1 $ 2 [ I,L ]

#正常化的首页网址为/

重写规则将/ home( \ ? * ) ? / $ 1 [ I, RP

, L]

重写规则/ /家[ I]

#前缀的URL与“ rewritten.aspx / ”

,这样ASP.NET处理他们

重写规则/ ( * ) / rewritten.aspx / $ 1 [

I]

这不包括已知的,静态文件( CSS , GIF等)

,但对于其他的,就前缀的URL与/ rewritten.aspx ,使得ASP.NET一命呜呼作为奖励,它的标准化到/ home

/表示任何请求通过301重定向,帮助与你的搜索引擎优化。保存该文件,并重新启动IIS (运行执行iisreset.exe )

这是实施的步骤1

。现在,为了实现第3步,下面的处理程序添加到您的Global.asax.cs文件:

保护无效的Application_BeginRequest

(对象发件人, EventArgs的发送)

{

的HttpApplication应用程序=发件人为的HttpApplication ;

如果(应用程序! = NULL)

如果(

app.Request.AppRelativeCurrentExecutionFilePath ==“ ? /

rewritten.aspx ” )

app.Context.RewritePath (

app.Request.Url.PathAndQuery.Replace

(“/ rewritten.aspx ”,“” )

) ;

}

此检测改写URL和未重写它们。这就行了! (或者至少它的作品在我的机器上

- 请分享您的经验。 )

现在你已经有了IIS 6上干净,无扩展名的URL

(可能在IIS5的,虽然我没有试过) ,而不使用通配符映射,并没有与IIS高效的静态文件处理干扰。

奖励选项5 :升级到Windows Server 2008和IIS

7

当然,这是与IIS 7要容易得多,因为它本身就支持。 NET

IHttpModules

,因此默认情况下你必须UrlRoutingModule插入到正确的服务器,你不必做任何事情奇怪,使其正常工作。

发表在未分类

  • 0
    点赞
  • 0
    收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值