在.NET7中,有没有办法只为特定的文件模式提供静态文件?

目前我有一个普通的老式:

app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = new PhysicalFileProvider(storageDirectory),
    RequestPath = "/",
});

但我在寻找更多的链接

app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = new PhysicalFileProvider(storageDirectory),
    RequestPath = "/[a-b0-9\-]+/.+"
});

不知何故,这有可能吗?

[更新1] 我可以在源代码中看到,路径用StartsWithSegments进行了判断:

https://github.com/dotnet/aspnetcore/blob/main/src/Middleware/StaticFiles/src/Helpers.cs

internal static bool TryMatchPath(HttpContext context, PathString matchUrl, bool forDirectory, out PathString subpath)
{
    var path = context.Request.Path;

    if (forDirectory && !PathEndsInSlash(path))
    {
        path += new PathString("/");
    }

    if (path.StartsWithSegments(matchUrl, out subpath))
    {
        return true;
    }
    return false;
}

看起来我需要编写一个定制的中间件?

推荐答案

根据文件:

RequestPath
The relative request path that maps to static resources. This defaults to the site root '/'.

即,它将仅允许指定静态资源所在的文件夹.

您可以try 的一个选项是通过UseWhenbranch the middleware pipeline的选项:

app.UseWhen(ctx => Regex.IsMatch(ctx.Request.Path.Value ?? "", ""), appBuilder =>
    appBuilder.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(storageDirectory),
    }));

Csharp相关问答推荐

循环访问Android视图中动态创建的子视图

EF Core在请求列表时忽略列,但在按ID获取时包含

如何在C#中删除一个特殊字符,如"使用Regex"

当我使用NET6作为目标框架时,为什么DotNet使用NET8作为MS包?

`Task`只有在C#中等待时才会运行吗?

如何将ASP.NET Core 2.1(在.NET框架上运行)更新到较新的版本?

使用可信第三方的Iext8.Net pdf签名

当用户右键单击文本框并单击粘贴时触发什么事件?

在具有不同属性名称的两个类之间创建关系

try 使用C#ASP.NET收集WMI信息时访问被拒绝,但在PowerShell中工作

NET8 MAUI并部署到真实设备上进行测试

如何通过寻找向量长度来优化两个循环?

C#Null判断处理失败

正在try 从Blazor中的API读取JSON

当使用Dapper映射DBNull时,我可以抛出异常吗?

有没有更好的方法来在CosmosDB上插入非id?

未在Windows上运行的Maui项目

如何使用IHostedService添加数据种子方法

从HTML元素获取 colored颜色

通过mini kube中的远程调试Pod与从emoteProcessPickerScript中解析错误输出的代码错误进行比较