部署 MVC应用到IIS
6总是会引起混乱在第一。你已经编码在Visual Studio
中,看到你可爱干净的URL中内置的Web服务器很好地工作,你坚持了一些代码的Windows Server
的计算机上,然后重击!这一切都像404找不到和你像嘿伙计,这不是很酷。
图像
这是因为IIS
6中仅调用时,看到的是被映射为aspnet_isapi.dll
URL中的“文件扩展名”(这是负责调用一个C / C + +的ISAPI筛选器) 。由于路由是。NET
IHttpModule的所谓UrlRoutingModule
,它不会被调用,除非本身被调用时,被调用的aspnet_isapi.dll只发生,而只发生时,有一个的。aspx在URL中。所以,没有的。aspx
,没有UrlRoutingModule ,因此404 。
我说你已经得到了解决此四种方式:
选项1:使用通配符映射的aspnet_isapi.dll
这告诉IIS
6中使用来处理所有的请求,所以路由总是调用,而且也没有问题。它的死很容易设置:打开IIS管理器中,右键单击您的应用程序,选择属性,然后主目录选项卡,然后单击配置。在通配符应用程序映射,然后单击插入(不添加,这是容易混淆的正上方)
,然后输入C:\ WINDOWS \ \框架\ V2.0.50727 \
aspnet_isapi.dll的为“可执行文件” ,然后取消选中确认文件是否存在。
完成了!现在路由只是行为,因为它总是在VS内置的服务器一样。
不幸的是,这也告诉IIS使用提供的所有请求,包括对静态文件。它将工作,因为有一个内置的DefaultHttpHandler
,做它,但根据您的要求在做什么,它可能会使用StaticFileHandler服务请求。
StaticFileHandler比IIS本身效率低得多。你看,它总是从磁盘读取文件的每一个请求,不缓存在内存中。它不发送,你可能已经在IIS中配置的Cache-
Control头,那么浏览器将不缓存它正确。它没有做HTTP压缩。但是,如果你能避免与请求干扰,
DefaultHttpHandler将控制传递回IIS的本地处理,这是好多了。
对于小型的Intranet应用程序,通配符映射可能是最好的选择。是的,它的影响略有表现,但是这可能不是一个问题给你。也许你有更好的事情操心。
对于较大的公共互联网应用,你可能需要一个解决方案,提供更好的性能。
更新:原来,你可以禁用选定的子文件夹通配符映射,它可以给你最好的两个世界。
方案2 :将ASPX中所有的路由条目“ URL模式
如果你不介意在你的网址。 ASPX
,只是通过你的路由配置,添加的。aspx一个正斜杠在每个模式之前。例如,使用(控制器)的。aspx / {行动} / {
id}的或myapp.aspx / {控制器} / {行动} / {
id}的。不要把ASPX里面的大括号的参数名称,或进入“默认”值,因为它不是真正的控制器名称的一部分 -
它只是在URL中,以满足IIS。
现在,您的申请将被就像一个传统的应用程序调用。
IIS仍处理静态文件。这可能是在共享主机方案中最简单的解决方案。不幸的是,你已经宠坏了你,否则干净的URL模式。
选项3:使用在所有的URL模式的自定义文件扩展名
这是与上述相同,除了用类似的东西。
MVC代替甑。它并没有真正创造任何优势,不是炫耀你正在使用 MVC等。
正如上文所述更新您的路由条目,除了投入的。aspx的。
MVC代替。接下来,注册一个新的ISAPI映射:打开IIS管理器中,右键单击您的应用程序,选择属性,然后主目录选项卡,然后单击配置。在映射选项卡,单击添加,然后输入C:
\ WINDOWS \ \框架\ V2.0.50727 \
aspnet_isapi.dll的为“可执行文件” , MVC (或任何你使用的扩展名)为“扩展”
,和取消选中确认文件是否存在。离开脚本引擎检查(除非你的应用程序有执行权限),并保留选中所有动词,除非你特别要过滤的HTTP方法。
这就是它 -
你现在使用的是自定义的扩展。不幸的是,它仍然是一个有点否则你干净的URL模式碍眼的。
选项4 :使用URL重写
这是一个技巧,使IIS认为有URL中的文件扩展名,即使没有。它的实施是最难解决方案,但只有一个,让完全干净的URL不会对性能有任何显著流失。
本Scheirman想出了关于这个问题的一个伟大的职位,但我适应的技术稍微以免无需以任何方式更改我的路由配置。下面是它的工作对我来说:
1
。作为扩展名的请求到达时,我们有一个第三方ISAPI筛选器重写添加已知延长期限的请求:甑。
2 。 IIS中看到的延伸,并将其映射为aspnet_isapi.dll
,因此在
3
。之前看到路由的要求,我们有一个的Application_BeginRequest (
)处理程序重写的URL回其原始的,无扩展名的形式
4 。路由看到扩展名的URL和正常的行为。
由于该URL被取消改写在步骤3中,你不必做任何事情好笑进行对外的URL生成工作。
该怎么办呢
首先,下载并安装赫利的下ISAPI_Rewrite
。您可以使用免费版本,版本2
,但要注意这会影响你的服务器上的所有网站。如果你需要重写定位到一个特定的应用程序或虚拟目录,你需要付费的版本之一。
现在编辑下ISAPI_Rewrite的配置(开始 - >所有程序
- >赫利 - >下ISAPI_Rewrite - >的httpd.ini ) ,并添加:
#如果你正在主持一个虚拟目录,使这些线路,
#进入你的虚拟目录的路径。
# UriMatchPrefix / myvirtdir
# UriFormatPrefix / myvirtdir
#将扩展到这个规则,以避免它们被由处理
( * ) ,重写规则\ (CSS | GIF | PNG | JPEG
| JPG | JS |邮编) 。 $ 1 $ 2 [ I,L ]
#正常化的首页网址为/
重写规则将/ home( \ ? * ) ? / $ 1 [ I, RP
, L]
重写规则/ /家[ I]
#前缀的URL与“ rewritten.aspx / ”
,这样处理他们
重写规则/ ( * ) / rewritten.aspx / $ 1 [
I]
这不包括已知的,静态文件( CSS , GIF等)
,但对于其他的,就前缀的URL与/ rewritten.aspx ,使得一命呜呼作为奖励,它的标准化到/ 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 和IIS
7
当然,这是与IIS 7要容易得多,因为它本身就支持。 NET
IHttpModules
,因此默认情况下你必须UrlRoutingModule插入到正确的服务器,你不必做任何事情奇怪,使其正常工作。
发表在未分类