ASP.Net MVC返回404的动作参数的URL但不是默认路由
我正在使用一个WebForms应用程序与一些MVC组件添加英寸这个想法是越来越多的应用程序转移到MVC,但没有它可以一次过渡。由于各种原因,我无法控制它必须使用ASP.Net 2.0和MVC 2.0,因为这些都是内置的。我还必须支持IIS 6和IIS 7.ASP.Net MVC返回404的动作参数的URL但不是默认路由
首先,我很清楚扩展路由的问题,并且我试图使用而不是,所以没有通配符映射等问题。我首次尝试使用我的路线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请求只是没有指定action/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 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部分是一个目录名称,没有找到该目录,然后保释)。
我的路线:
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管理器中指向asp_net ISAPI DLL的mvc映射,并得到了相同的结果
确定只是为了让其他人看起来不愚蠢,事实证明,这是一个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);