Asp.net-Mvc

防止靜態文件處理程序攔截類似文件名的 URL

  • January 14, 2013

在我的 Web 應用程序中,我有一個如下所示的路由:

routeCollection.MapRoute(
   "AdfsMetadata",                                                // name
   "FederationMetadata/2007-06/FederationMetadata.xml",           // url
   new { controller = "AdfsController", action = "MetaData" });   // defaults

這條路線背後的想法是更好地與 Microsoft AD FS 伺服器 (2.0+) 一起工作,此時您只需指定主機名即可查找 AD FS 元數據。使用 MVC3 一切正常。但是我們最近將項目升級到了 MVC4,現在對該 URL 的呼叫導致 404,錯誤頁面上提到的處理程序是StaticFile,物理路徑是D:\path\to\my\project\FederationMetadata\2007-06\FederationMetadata.xml. 我假設 MVC 或 ASP.NET “認為”它必須是對靜態文件的請求並查找文件,但它不是文件。數據是動態生成的——這就是我將 URL 路由到控制器操作的原因。問題是,即使是 Phil Haack 的 Route Debugger 也不起作用。除了 IIS 試圖訪問不存在的物理文件之外,它只是一個 404,沒有其他資訊。

有人對此有解決方案嗎?我只想將此 URL 路由到控制器操作。

PS:我*不是 100%*確定原因是升級到 MVC4,這只是一個猜測,因為錯誤發生在升級的大約同一時間,並且相同的路線適用於仍在使用 MVC3 的另一個項目。

編輯:

我有一個自定義ControllerFactory需要完整的類名(AdfsController而不是Adfs),因此在這種情況下後綴Controller是正確的。

將以下內容添加到節點的<handlers>部分:<system.webServer>

<add 
   name="AdfsMetadata" 
   path="/FederationMetadata/2007-06/FederationMetadata.xml" 
   verb="GET" 
   type="System.Web.Handlers.TransferRequestHandler" 
   preCondition="integratedMode,runtimeVersionv4.0" />

這指示 IIS 對指定 url 的 GET 請求應由託管管道處理,而不是視為靜態文件並由 IIS 直接提供服務。

我有一個自定義的 ControllerFactory,它需要完整的類名(AdfsController 而不是 Adfs),所以在這種情況下後綴 Controller 是正確的。

請仔細檢查。Controller嘗試在路由定義中使用和不使用後綴。

引用自:https://stackoverflow.com/questions/14327476