25

在 IIS 5(6 或 7)上托管 ASP.NET MVC 应用程序的最佳方法是什么。当我尝试发布我的 ASP.NET MVC 应用程序时,我似乎得到的只是 404 错误。我做了一些谷歌搜索并找到了几个解决方案,但看起来都不是超级优雅,我担心一旦我开始为应用程序使用共享托管环境,它们是否会无法使用。

解决方案 1

  1. 右键单击 inetmgr.exe 上的应用程序虚拟目录。
  2. 属性-> 虚拟目录选项卡-> 配置。
  3. 添加新的映射扩展。扩展名应该是 .*,它将被映射到可执行文件 C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll 或您计算机上的适当位置(您可以简单地从映射中复制它.aspx 文件)。在映射上取消选中“检查文件是否存在”。
  4. 3 X OK,你就可以走了。
  5. 如果需要,您可以将此设置应用于您的所有网站。在第 1 步中,单击“默认网站”节点而不是您自己的虚拟目录,在第 2 步中转到“主目录”选项卡。其余的都是一样的。

通过 ASP.NET 路由所有内容似乎有点笨拙。

解决方案 2

编辑 MVC 路由以在 URL 中包含 .mvc,然后按照基于此扩展的解决方案 1 中的步骤进行操作。编辑:原始图片链接已丢失,但此处来自 Google 的缓存:

替代文字

4

5 回答 5

13

答案在这里

如果 *.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 中,因此无需对其进行特殊设置。

于 2008-09-11T21:45:41.470 回答
8

我认为无论哪种方式,您都必须执行解决方案 1

考虑 HTTP 请求管道。

  1. 一个请求进入 IIS。
  2. IIS 检查端口/主机标头以查看它是否设置了一个网站来捕获对该主机标头/端口的请求。
  3. 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,
泰勒

于 2008-09-11T21:46:00.813 回答
3

运行:C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll -i

这将为 aspnet 用户重置 IIS 注册表设置。

创建虚拟目录: 1. 右键单击​​要转换的目录

  • 选择属性
    1. 在目录下,选择创建。
    2. 在配置下,选择添加。
    3. 对于可执行插入:

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll

对于扩展插入:.*

  • 取消选中“检查文件是否存在”</p>

  • 在 Documents 下添加入口点文件,即:Default.htm、index.htm、Global.asax

  • 在目录设置下

    1. 选择编辑...
    2. 选择匿名访问
    3. 取消选中允许 IIS 控制密码
    4. 取消选中基本身份验证
    5. 取消选中集成 Windows 身份验证
    6. 在 ASP.NET 下,确保版本 = v4.0.30319

注意用户名,即:IUSR_AVSJ82S

设置物理目录的共享权限:

  • 在 Windows 资源管理器中,转到已转换为虚拟目录的物理目录。右键单击目录名称
  • 选择属性
  • 在安全选项卡下,选择添加
  • 输入 IIS 用户名,即:IUSR_AVSJ82S 单击检查名称。
  • 点击确定
  • 将权限设置为读取和写入。
于 2012-11-08T01:56:26.513 回答
1

您是否尝试将 .aspx 添加到控制器名称的末尾?

它适用于 Stack Overflow 问题我在哪里可以获得 ASP.NET MVC 托管?.

于 2008-09-11T21:35:32.197 回答
1

仅供参考:在服务器 2003 上(开发一个必须连接到 RPS 的应用程序),它不允许我添加扩展名 .*,我使用了修改路由子句的替代解决方案,并且有效。

于 2009-05-15T17:57:03.873 回答