Есть ли FileProvider в ASP.NET Core для предоставления версионных файлов по папкам вместо параметров? - PullRequest
0 голосов
/ 11 ноября 2019

Мне нужно версия файлов 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 не поддерживает подстановочный знак.

Есть ли способ сделать это без специального Middleware? Промежуточное программное обеспечение 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 метод может позаботиться о написании.

1 Ответ

0 голосов
/ 11 ноября 2019

В конце я использую Действие для обслуживания файла:

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...