繁体   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