1

我正在使用添加了一些 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 并得到了相同的结果

4

1 回答 1

1

好的,只是为了让其他人看起来不傻,事实证明这是 URL 的问题...... URL 被发送到站点的根目录,而不是应用程序目录。我应该首先检查一下。我不认为这是问题所在,因为当我在地址栏中手动输入 URL 时,它在 Index 上工作,但操作方法需要 HttpPost,因此是脚本和手动输入的地址吐出的综合因素相同的错误信息。

对于其他混合 WebForms 和 MVC 的人,请仔细检查您的 URL 是否正确。这是我现在在 WebForms 母版页上使用的一些代码,这样我的客户端 JS 就可以知道在哪里路由 MVC 请求:

string baseUrl =  Request.Url.GetLeftPart(UriPartial.Authority);
if (baseUrl.EndsWith("/")) baseUrl = baseUrl.Substring(0, baseUrl.Length - 1);
baseUrl = baseUrl + ResolveUrl("~/");
Page.ClientScript.RegisterHiddenField("BaseUrl", baseUrl);
于 2012-08-02T21:01:25.480 回答