我正在使用一個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映射,並得到了相同的結果