File ASP.NET Core中的任何文件提供程序是否按文件夹而不是参数提供版本控制的文件?

File ASP.NET Core中的任何文件提供程序是否按文件夹而不是参数提供版本控制的文件?,file,asp.net-core,fileprovider,File,Asp.net Core,Fileprovider,我需要对Javascript文件进行版本设置(用于清除缓存),但无法使用asp append version,因为脚本文件是从Javascript导入使用的: 从“/Foo.js”导入*为Foo 因此,我计划有一个FileProvider,它可以像/js/v1.0/app.js(因此foo.js将从/js/v1.0/foo.js提供)。只要保持相对路径,就可以提供/v1.0/js/main.js 我试过这个: app.UseStaticFiles(new StaticFileOp

我需要对Javascript文件进行版本设置(用于清除缓存),但无法使用
asp append version
,因为脚本文件是从Javascript导入使用的:

从“/Foo.js”导入*为Foo

因此,我计划有一个
FileProvider
,它可以像
/js/v1.0/app.js
(因此
foo.js
将从
/js/v1.0/foo.js
提供)。只要保持相对路径,就可以提供
/v1.0/js/main.js

我试过这个:

        app.UseStaticFiles(new StaticFileOptions()
        {
            RequestPath = "/v*",
        });
        app.UseStaticFiles();
但它不起作用,
RequestPath
不支持通配符

有没有一种方法可以在没有自定义中间件的情况下做到这一点?在我看来,文件提供者中间件在这方面做得太过火了。这是我目前的临时解决方案:

    public static IApplicationBuilder UseVersionedScripts(this IApplicationBuilder app)
    {
        app.Use(async (context, next) =>
        {
            if (context.Request.Path.HasValue &&
                context.Request.Path.Value.ToLower().StartsWith("/js/v"))
            {
                var filePath = context.Request.Path.Value.Split('/');


                // Write the file to response and return if file exist
            }

            await next.Invoke();
        });

        return app;
    }

编辑:我认为在我的情况下,如果不支持FileProvider,控制器操作可能比中间件更好,因为
PhysicalFile
方法可以处理写入操作。

我制作了一个可重用的FileProvider,它“转换”(删除)版本路径:


旧答案:

最后,我使用一个操作来提供文件:

[ApiController]
public class FileController : ControllerBase
{

    IHostEnvironment env;
    public FileController(IHostEnvironment env)
    {
        this.env = env;
    }

    [HttpGet, Route("/js/{version}/{**path}")]
    public IActionResult JavascriptFile(string version, string path)
    {
        var filePath = Path.Combine(
            env.ContentRootPath,
            @"wwwroot\js",
            path);

        if (System.IO.File.Exists(filePath))
        {
            return this.PhysicalFile(filePath, "application/javascript");
        }

        return this.NotFound();
    }

}
[ApiController]
public class FileController : ControllerBase
{

    IHostEnvironment env;
    public FileController(IHostEnvironment env)
    {
        this.env = env;
    }

    [HttpGet, Route("/js/{version}/{**path}")]
    public IActionResult JavascriptFile(string version, string path)
    {
        var filePath = Path.Combine(
            env.ContentRootPath,
            @"wwwroot\js",
            path);

        if (System.IO.File.Exists(filePath))
        {
            return this.PhysicalFile(filePath, "application/javascript");
        }

        return this.NotFound();
    }

}