首页 新闻 会员 周边 捐助

如何让 ASP.NET Core 的静态文件中间件在 Linux 上不区分大小写

0
悬赏园豆:100 [已解决问题] 解决于 2019-06-26 22:07

将一个跑在 Windows 上的 ASP.NET 项目迁移到 ASP.NET Core 并跑在 Linux 上时遇到了一个障碍,Windows 不区分文件路径的大小写, 而 Linux 区分大小写,这会造成很多静态文件的引用路径因为大小写问题而失效,请问如何解决这个问题?

dudu的主页 dudu | 高人七级 | 园豆:30778
提问于:2019-06-26 10:53
< >
分享
最佳答案
0

借助中间件(middleware)可以“篡改”请求上下文信息(这里是Request.Path)的能力解决了这个问题

中间件的实现代码如下:

public class LowercaseUrlMiddleware
{
    private readonly RequestDelegate _next;
    private readonly IEnumerable<string> _wwwrootDirs;

    public LowercaseUrlMiddleware(RequestDelegate next, IEnumerable<string> wwwrootDirs)
    {
        _wwwrootDirs = wwwrootDirs;
        _next = next;
    }

    public Task Invoke(HttpContext context)
    {
        var path = context.Request.Path.Value;
        if (_wwwrootDirs.Any(dir => path.IndexOf($"/{dir}", StringComparison.OrdinalIgnoreCase) == 0))
        {
            context.Request.Path = new PathString(context.Request.Path.Value.ToLower());
        }

        return _next(context);
    }
}

Startup.Configure 中添加中间件的代码如下:

var wwwrootDirs = Directory.GetDirectories(env.WebRootPath)
    .Select(dir => Path.GetFileName(dir));
app.UseMiddleware<LowercaseUrlMiddleware>(wwwrootDirs);
app.UseStaticFiles();
dudu | 高人七级 |园豆:30778 | 2019-06-26 22:06

前提是所有静态文件名都用小写

dudu | 园豆:30778 (高人七级) | 2019-06-26 22:08
其他回答(3)
0

项目中文件命名规范一下,然后文件引用地址改为相对地址

收获园豆:20
小光 | 园豆:1766 (小虾三级) | 2019-06-26 11:02

这是一个迁移项目,现实情况不允许修改所有地方的引用路径

支持(0) 反对(0) dudu | 园豆:30778 (高人七级) | 2019-06-26 11:18
0

写一个中间件,拦截静态文件后缀,扫描本地所有静态文件,建立map,然后map忽略大小写。

收获园豆:80
czd890 | 园豆:14488 (专家六级) | 2019-06-26 13:45

StaticFileOptions.ctor(SharedOptions.IFileProvider) 从fileprovider想办法?,实现一个自己的,去处理忽略大小写

支持(0) 反对(0) czd890 | 园豆:14488 (专家六级) | 2019-06-26 13:46

@czd890: IFileProvider 的默认实现是 PhysicalFileProvider

支持(0) 反对(0) dudu | 园豆:30778 (高人七级) | 2019-06-26 14:21

@czd890: 静态文件的路径是在 StaticFiles/src/Helpers.cs 中通过 HttpContext.Request.Path 获取的

支持(0) 反对(0) dudu | 园豆:30778 (高人七级) | 2019-06-26 14:43

@czd890: 如果将 Request.Path 转换为小写就能解决

支持(0) 反对(0) dudu | 园豆:30778 (高人七级) | 2019-06-26 14:43

@dudu: 能解决一部分问题,不过还是不健壮,就怕大小写乱来的情况...

支持(0) 反对(0) czd890 | 园豆:14488 (专家六级) | 2019-06-28 13:01

@czd890: 你提供的解决思路的确更健壮,我根据实际场景选择了不太健壮但实现成本较低的折中方法

支持(0) 反对(0) dudu | 园豆:30778 (高人七级) | 2019-06-29 08:57
0

静态文件名 驼峰命名的怎么办。。。

codingHeart | 园豆:1511 (小虾三级) | 2020-06-03 18:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册