在IIS 5(6或7)上托管ASP.NET MVC应用程序的最佳方法是什么?当我尝试发布我的ASP.NET MVC应用程序时,我似乎得到的只是404错误.我已经做了一些googleing并找到了几个解决方案,但似乎都不是超级优雅,我担心一旦我来为应用程序使用共享托管环境它们将无法使用.
解决方案1
右键单击inetmgr.exe上的应用程序虚拟目录.
属性 - >虚拟目录选项卡 - >配置.
添加新的映射扩展.扩展名应为.*,它将映射到可执行文件C:\ WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll,或者计算机上的相应位置(您只需将其映射到映射中即可) .aspx文件).在映射上取消选中"检查该文件是否存在".
3 X好,你很高兴.
如果需要,可以将此设置应用于所有网站.在步骤1中,单击"默认网站"节点而不是您自己的虚拟目录,然后在步骤2中转到"主目录"选项卡.其余的都是一样的.
通过ASP.NET路由一切似乎有点麻烦.
解决方案2
编辑MVC路由以在URL中包含.mvc,然后根据此扩展按照解决方案1中的步骤操作.编辑:原始图片链接已丢失,但此处来自Google的缓存:
答案在这里
如果*.mvc扩展名未注册到主机,则会给出404异常.在这种情况下托管MVC应用程序的工作方式是以下列方式修改global.asax路由caluse.
routes.Add(new Route("{controller} .mvc.aspx/{action}",new MvcRouteHandler()){Defaults = new RouteValueDictionary(new {controller ="YourController"})});
这样,您的所有控制器请求都将以*.mvc.aspx结尾,您的主机可以识别该请求.并且当MVC dll被复制到您的本地bin中时,不需要为它进行特殊设置.
我想无论哪种方式,你都必须做解决方案1.
考虑HTTP请求管道.
一个请求进入IIS.
IIS检查端口/主机标头,以查看是否已设置网站以捕获对该主机标头/端口的请求.
IIS调查请求的文件扩展名(.php,.asp,.aspx)并将其交给可以处理该类型请求的ISAPI.
只有在这一点上,ASP.NET(或PHP运行时)才会启动.如果IIS没有该映射,那么它永远不会将请求移交给ASP.NET运行时,并且请求永远不会到达您的代码.这就是为什么你需要将glob(*)映射到ASP.NET ISAPI的原因.
ASP.NET MVC框架URL通常根本没有文件扩展名结尾.如果您希望ASP.NET(或其他某些运行时)处理这些请求,则必须将所有请求映射到该ISAPI(即aspnet_isapi.dll),而不管文件扩展名如何.
这通常也适用于需要提供.jpg,.gif等媒体的HttpHandler.对于要处理的处理程序,即使.jpg不是"普通"ASP.NET文件扩展名,它也需要映射到您的代码.
HTH,
泰勒