Asp.net-Mvc
ASP.NET Core 將路由映射到靜態文件處理程序
我正在使用 Angular 開發 ASP.NET Core 網站(以前稱為 ASP.NET 5 / vNext)。為了讓 Angular 工作,我需要一個包羅萬象的路線:
app.UseStaticFiles(); app.UseMvc(routes => { // Angular fallback route routes.MapRoute("angular", "{*url}", new { controller = "Home", action = "Index" }); });我在 wwwroot 中也有一些文件/文件夾,例如:
wwwroot/app wwwroot/assets wwwroot/lib當對這些路徑發出任何請求時,例如
http://example.com/assets/css/test.css,並且文件 (test.css) 不存在,它不應該繼續回退路由。它應該返回 404。現在,如果文件不存在,它會返回 Angular HTML。那麼,我怎麼能告訴它以“/assets”開頭的任何路徑都應該只被路由/服務
UseStaticFiles?
這似乎有效:
app.MapWhen( context => { var path = context.Request.Path.Value.ToLower(); return path.StartsWith("/assets") || path.StartsWith("/lib") || path.StartsWith("/app"); }, config => config.UseStaticFiles());但是,我不確定是否有任何性能(或其他類型的)影響。如果我遇到任何情況,我會更新。
奇怪的是,這種常見情況(因為許多人使用 SPA)幾乎沒有在任何地方涵蓋,每個人都必鬚髮明一些東西。我發現最好的方法是添加約束(例如,如果路徑中有 /api 或“.”,則不要使用該路由)。不幸的是,不支持開箱即用,但您可以自己編寫此約束或複制我從此處編寫的約束。
這篇文章有更多細節。但通常程式碼如下所示:
app.UseMvc(routes => { routes.MapRoute( name: "api", template: "api/{controller}/{action}"); routes.MapRoute( name: "angular", template: "{*url}", defaults: new {controller = "Home", action = "Index"}, constraints: new {url = new DoesNotContainConstraint(".", "api/") }); });PS也許這個約束現在開箱即用,但我還沒有找到。或者,可以使用正則表達式,但簡單的應該更快。