我正在使用添加了一些 MVC 组件的 WebForms 应用程序。我的想法是将越来越多的应用程序移到 MVC 上,但它不可能一次全部转换。由于各种原因,我无法控制它必须使用 ASP.Net 2.0 和 MVC 2.0,因为它们是内置的。我还必须支持 IIS 6 和 IIS 7。
首先,我很清楚无扩展路由的问题,并且我没有尝试使用它,因此通配符映射等没有问题。我首先尝试使用我的路由 ala "{controller}.aspx/{action}/ {id}”,但在将头撞到墙上后,我切换到“{controller}.mvc/{action}/{id}”,但遇到了同样的问题。
其次,即使在我的开发机器上的 IIS 7 集成模式下,我也无法让它工作,更不用说经典模式或 IIS 6。它在 Cassini 下都可以正常运行,但是一旦我部署到 IIS 7,MVC 组件就会中断。由于这是在我的开发机器上,我知道 ASP.Net 已正确注册到 IIS,并且我可以在控制面板中看到所有继承的 HTTP 处理程序(例如:ASPX 映射到 PageHandlerFactory)。
症状:
所有 ASPX WebForms 请求都能正常工作。
一个 MVC 请求只对控制器没有指定动作/id 被路由到 MVC 并正确执行。
对带有 action 或 id 的 MVC 路由的任何请求都会立即返回 404。就好像 IIS 认为“.mvc”扩展名是文件夹路径的一部分,所以它忽略 HTTP 处理程序并返回 404。
换句话说:
/app/WebForm.aspx - HTTP 200 OK,执行 WebForm.aspx.cs 代码隐藏
/app/Fancy.mvc - HTTP 200 OK,执行 /Controllers/FancyController.cs,索引方法
/app/Fancy。 mvc/DoThingy - HTTP 404 NOT FOUND,即使 FancyController 有 DoThingy 方法
糟糕的解决方案:我尝试过设置 runAllManagedModulesForAllRequests 之类的方法,但这不仅对性能不利,而且还破坏了我的 Web 表单。即使我将其设置为忽略所有带有 .ASPX 的路由,它们仍然会中断。
我不能使用通配符映射,所以没有帮助。
其他详细信息:我在 web.config/system.WebServer 中设置了我的 HTTP 处理程序。它是列出的第一个处理程序。
<add name="MvcRoutingHandler" preCondition="integratedMode" verb="*" path="*.mvc" type="System.Web.Routing.UrlRoutingHandler, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" resourceType="Unspecified" />
我指定什么处理程序或什么选项似乎并不重要 - IIS 似乎没有检查任何这种配置(再次因为它似乎认为路径的 Fancy.mvc 部分是目录名称,不t 找到该目录,然后保释)。
我的路线:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
routes.IgnoreRoute("{resource}.asmx/{*pathInfo}");
routes.IgnoreRoute("{resource}.aspq/{*pathInfo}");
routes.IgnoreRoute("{resource}.svc/{*pathInfo}");
routes.MapRoute("Default",
"{controller}.mvc/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
更新:我尝试使用 IIS 7 经典模式;然后我在 IIS 管理器中添加了一个 .mvc 映射,指向 asp_net ISAPI dll 并得到了相同的结果