2012-06-29 82 views
17

我一直在谷歌搜索和修補了幾個小時,並沒有真正取得很大進展,所以希望這裏有人可以提供幫助。ASP.NET MVC路由:繞過路徑的靜態文件處理程序

我試圖讓所有的請求到一個特定的路徑由第三方組件處理。

編輯而且我需要所有其他路徑的所有請求才能正常運行。

我使用的是路由處理,像這樣一個通配符映射:

routes.Add(new Route("pathiwant/{*EverythingElse}", new MyRouteHandler())); 

所有傳統路線前進正確的處理程序,它很好地轉發到第三方組件。當我打擊靜態文件(.html,.txt等)時,它們會被StaticFile處理程序而不是我的處理程序拾取,因此我試圖關閉StaticFile處理程序,如下所示(簡化):

<system.webServer> 
    <handlers> 
    <remove name="StaticFile"/> 
    </handlers> 
</system.webServer> 

這會關閉StaticFile處理程序,但MVC仍然不會拾取路徑。

我不想回到創建自己的處理程序並注入ASP請求堆棧,因爲它似乎應該有一個MVC快樂的方式來做到這一點。

有什麼想法?謝謝。

回答

14

這裏有幾個選項。

http://www.hanselman.com/blog/BackToBasicsDynamicImageGenerationASPNETControllersRoutingIHttpHandlersAndRunAllManagedModulesForAllRequests.aspx

如果你真的想通過asp.net管道運行的所有請求,那麼你需要。

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 

更新

另一種選擇,特別是如果你需要繞過靜態處理程序被限制到您的網站的一個子集,是對使用以下

<add name="ApiURIs-ISAPI-Integrated-4.0" 
    path="/subdirectory/*" 
    verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" /> 

考慮如何mvc網站,大多數靜態文件是從一對熟知的目錄中處理的,這是一個更好的選擇。

+0

感謝。這絕對是我嘗試過的,但我確實需要正常處理所有其他路徑。這真的開始似乎沒有MVC的方式來做到這一點,我應該分解並在MVC之前添加處理程序。 – jmoss

+0

不確定你想要和不想處理的具體細節,但是,爲了處理mvc中的事情,asp.net管道需要接收所有適當的請求。 –

+0

重要提示:''僅適用於運行集成模式管道的應用程序池。這對於在Classic模式下運行的應用程序池不起作用。 – BenSwayne

2

對此的最佳解決方案可能是使用URL Rewriter將來自原始URL的請求代理爲MVC友好選擇。

例如,您需要能夠自動加載從數據庫提供的內容中的相對URL。

RewriteRule ^/load/(\d+)/rel(\?.*)? - [L] 
RewriteRule ^/load/(\d+)/(.*)$ /load/$1/rel?path=$2 [P,QSA,L,NC] 

這些規則將讓您設置了兩個MVC路線:

routes.MapRoute(
    "Load Item", 
    "load/{itemId}", 
    new { controller = "Load", action = "Index" } 
    ); 

routes.MapRoute(
    "Load Relative Item", 
    "load/{itemId}/rel", //?path= 
    new { controller = "Load", action = "Relative" } 
    ); 

然後你的操作方法比較簡單:

public ActionResult Index(int itemId) { ... } 

public FileStreamResult Relative(int itemId, string path) { ... } 

第一個重寫規則,以防止有含路徑/ rel被重寫;他們已經在最後的形式。第二個重寫規則代理(而不是重定向)請求。

例如

/load/1234/file.xml 

變得

/load/1234/rel?path=file.xml 

代理所述請求而不是做客戶端重定向能嵌套相對路徑以及工作(並隱藏從最終用戶的祕密醬。)