0

我需要对我的 Javacript 文件进行版本控制(用于清除缓存目的),但不能使用asp-append-version,因为脚本文件是从 Javascript 导入中使用的:

import * as Foo from './foo.js'

因此,我计划有一个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不支持通配符。

没有自定义中间件有没有办法做到这一点?在我看来,FileProvider 中间件对此非常过分。这是我目前的临时解决方案:

    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方法可以处理写作。

4

1 回答 1

0

我制作了一个可重用的 FileProvider 来“转换”(删除)版本路径:https ://github.com/BibliTech/VersionedFileProvider

var versionedFileProvider = new VersionedFileProvider(env.WebRootFileProvider);
app.UseStaticFiles(new StaticFileOptions()
{
    FileProvider = versionedFileProvider,
});

旧答案:

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

[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();
    }

}
于 2019-11-11T09:28:38.923 回答