ASP.Net MVC为具有Action参数的URL返回404,但不为默认路由返回404

本文关键字:返回 路由 默认 URL MVC Net 参数 Action ASP | 更新日期: 2024-09-22 06:36:52

我使用的是一个添加了一些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下正常运行,但一旦我部署到IIS7,MVC组件就会中断。由于这是在我的开发机器上,我知道ASP.Net已正确注册到IIS,并且我可以在控制面板中看到所有继承的HTTP处理程序(例如:ASPX映射到PageHandlerFactory)。

症状
所有ASPX WebForms请求都能完美工作
MVC对的请求只是没有指定操作/id的控制器被路由到MVC并正确执行
任何对MVC路由的带有操作或id的请求都会立即返回404。就好像IIS认为".mvc"扩展是文件夹路径的一部分,所以它忽略了HTTP处理程序并返回404。

换句话说:
/app/WebForm.aspx-HTTP 200 OK,执行WebForm.aspx代码隐藏
/app/Fancy.mvc-HTTP 200 OK,执行/Controllers/FancyController.cs,索引方法
/app/Fancy.mvc/DoThingy-HTTP 404未找到,即使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部分是一个目录名,找不到那个目录,然后就放弃了)。

我的路线:

        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,得到了相同的结果

ASP.Net MVC为具有Action参数的URL返回404,但不为默认路由返回404

好吧,只是为了让其他人看起来不愚蠢,事实证明这是URL的问题。。。URL被发送到网站的根目录,而不是应用程序目录。我一开始就应该检查一下。我不认为这是问题所在,因为当我在地址栏中手动键入URL时,它在索引上起作用,但操作方法需要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);