Asp.net-Mvc

ASP.NET Core 將路由映射到靜態文件處理程序

  • May 2, 2020

我正在使用 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也許這個約束現在開箱即用,但我還沒有找到。或者,可以使用正則表達式,但簡單的應該更快。

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