将一个跑在 Windows 上的 ASP.NET 项目迁移到 ASP.NET Core 并跑在 Linux 上时遇到了一个障碍,Windows 不区分文件路径的大小写, 而 Linux 区分大小写,这会造成很多静态文件的引用路径因为大小写问题而失效,请问如何解决这个问题?
借助中间件(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();
前提是所有静态文件名都用小写
项目中文件命名规范一下,然后文件引用地址改为相对地址
这是一个迁移项目,现实情况不允许修改所有地方的引用路径
写一个中间件,拦截静态文件后缀,扫描本地所有静态文件,建立map,然后map忽略大小写。
StaticFileOptions.ctor(SharedOptions.IFileProvider) 从fileprovider想办法?,实现一个自己的,去处理忽略大小写
@czd890: IFileProvider 的默认实现是 PhysicalFileProvider
@czd890: 静态文件的路径是在 StaticFiles/src/Helpers.cs 中通过 HttpContext.Request.Path
获取的
@czd890: 如果将 Request.Path
转换为小写就能解决
@dudu: 能解决一部分问题,不过还是不健壮,就怕大小写乱来的情况...
@czd890: 你提供的解决思路的确更健壮,我根据实际场景选择了不太健壮但实现成本较低的折中方法
静态文件名 驼峰命名的怎么办。。。