2012-08-02 87 views
1

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

回答

1

確定只是爲了讓其他人看起來不愚蠢,事實證明,這是一個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);