2016-02-23 69 views
4

我正在使用Angular處理ASP.NET Core網站(以前稱爲ASP.NET 5/vNext)。爲了使角工作,我需要有一個包羅萬象的路線:ASP.NET Core map路由到靜態文件處理程序

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路由/投放?

謝謝。

+0

你的默認路徑poiting到任何網址「{* url}」搞亂UseStaticFiles。 Angular的入口點可能只是「/」。 – Fals

+0

是的,我知道......我該如何解決它?我需要Angular的默認路由。 – pbz

+0

您應該將默認路由指向靜態index.html文件。沒有必要使用MVC來呈現Angular默認入口點 – Fals

回答

4

這似乎工作:

app.MapWhen(context => 
     { 
      var path = context.Request.Path.Value; 
      return path.StartsWith("/assets", StringComparison.OrdinalIgnoreCase) || 
        path.StartsWith("/lib", StringComparison.OrdinalIgnoreCase) || 
        path.StartsWith("/app", StringComparison.OrdinalIgnoreCase); 
     }, config => config.UseStaticFiles()); 

但是,我不知道是否有任何性能(或其他類型的)影響。如果遇到任何問題,我會更新。

1

奇怪的是,這種常見情況(因爲許多人使用SPA)幾乎不在任何地方,每個人都必須發明一些東西。我發現最好的方法是添加約束(例如,如果路徑中存在/ api或「。」,則不要使用路由)。不幸的是,這不是開箱即用的支持,但您可以自己編寫這個約束條件,也可以複製我從here中編寫的約束條件。

這個post有一點點細節。但通常代碼如下所示:

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/") });     
    }); 

P.S.也許這個限制現在已經存在,但我還沒有找到。或者可以使用正則表達式,但簡單的應該更快。

相關問題