[英]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.