C# ASP.NETMVC返回404,用于带有操作参数的URL,但不用于默认路由

C# ASP.NETMVC返回404,用于带有操作参数的URL,但不用于默认路由,c#,asp.net,asp.net-mvc,asp.net-mvc-2,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 2,我正在使用添加了一些MVC组件的WebForms应用程序。我们的想法是将越来越多的应用程序转移到MVC上,但不可能一次将其全部转换。由于各种原因,我无法控制它必须使用ASP.NET2.0和MVC2.0,因为它们是内置的。我还必须支持IIS 6和IIS 7 首先,我很清楚无扩展路由的问题,我没有尝试使用它,因此通配符映射等方面没有问题。我首先尝试使用我的路由“{controller}.aspx/{action}/{id}”,但在我的头撞到墙上之后,我切换到了“{controller}.mvc/{a

我正在使用添加了一些MVC组件的WebForms应用程序。我们的想法是将越来越多的应用程序转移到MVC上,但不可能一次将其全部转换。由于各种原因,我无法控制它必须使用ASP.NET2.0和MVC2.0,因为它们是内置的。我还必须支持IIS 6和IIS 7

首先,我很清楚无扩展路由的问题,我没有尝试使用它,因此通配符映射等方面没有问题。我首先尝试使用我的路由“{controller}.aspx/{action}/{id}”,但在我的头撞到墙上之后,我切换到了“{controller}.mvc/{action}/{id}”,但我遇到了同样的问题

第二,即使在我的开发机器上的IIS7集成模式下,我也无法让它工作,更不用说经典模式或IIS6了。它在Cassini下运行正常,但一旦我部署到IIS7,MVC组件就会崩溃。由于这是在我的开发机器上,我知道ASP.Net已正确注册到IIS,并且我可以在控制面板中看到所有继承的HTTP处理程序(例如:ASPX映射到PageHandlerFactory)

症状
所有ASPX WebForms请求都能正常工作。
MVC只请求未指定操作/id的控制器,并将其路由到MVC并正确执行。
任何带有操作或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,即使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 7经典模式;然后,我在IIS管理器中添加了一个.mvc映射,指向asp_net ISAPI dll,得到了相同的结果

好吧,只是为了让其他人看起来不傻,结果证明这是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);

好吧,只是为了让其他人看起来不傻,结果发现这是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);