簡體   English   中英

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

[英]ASP.NET Core map route to static file handler

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

如果您使用的是屬性模板路由,那么您可以應用這個優雅的解決方案:

[HttpGet("")]
[HttpGet("{*route:regex(^(?!skipped).*$)}")]
public async Task<IActionResult> Default(string route) { throw new NotImplementedException(); }

因此,此操作將忽略所有以skipped開頭的路由。
如果您想要多個前綴或其他任何東西,那么只需根據您的需要更新正則表達式。
首先需要 Get 屬性來處理站點的根目錄(在這種情況下, route變量為null )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM