Taikyti asp-append-version be statinių failų wwwroot aplanke
Aplinkos
- Vizualinė studija
-
- Vizualinė studija 2019
- ASP.NET branduolys
-
- 3.1 (Skustuvo puslapis, MVC)
Statiniai failai, patalpinti už wwwroot aplanko ribų, neatspindi asp-append-version
app.UseStaticFiles
Nurodydami papildomą StaticFileOptions
metodo iškvietimą
Statiniai failai taip pat gali būti dedami į aplankus, išskyrus wwwroot.
Tačiau statiniams failams, patalpintiems už wwwroot aplanko ribų, saitas ir scenarijaus žymos
asp-append-version
Nustačius atributą, į URL neįtraukiama versijos informacija.
Pabandysiu. Failai išdėstyti šiomis konfigūracijomis:
Startup.Configure
būdas taip pat publikuoti aplanką Sritys /Svetainė1/Turinys.
// wwwroot フォルダで静的ファイル参照を有効にする
app.UseStaticFiles();
// Site1 用の物理コンテンツフォルダと参照 URL を紐づける
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "Areas/Site1/Content")),
RequestPath = "/Site1",
});
Šis index.cshtml
kodas pridėtas prie . Kiekvienas asp-append-version
pridedamas.
<!-- ここから追加 -->
<!-- wwwroot のファイル -->
<img src="~/image/sample.png" asp-append-version="true" />
<!-- wwwroot 以外のファイル -->
<img src="~/site1/image/sample1.png" asp-append-version="true" />
<!-- ここからまで -->
Paleidus jį, vaizdas rodomas teisingai.
Tačiau, jei pažvelgsite į puslapio HTML, pamatysite, kad eilutė išplečiama tik į failus, esančius wwwroot.
Priežastys, kai asp-papildymo versija neatsispindi
Tai priklauso nuo ypatybės, kuri nustato, ar asp-papildymo versija env.WebRootFileProvider
IFileProvider
atsispindi.
Pagal numatytuosius nustatymus nurodytas wwwroot PhysicalFileProvider
nustatomas taip, kad jis neatsispindėtų kituose aplankuose.
Yra IFileProvider
klasė, kuri gali turėti daugiau nei CompositeFileProvider
vieną
Čia galite supakuoti daugiau nei vieną PhysicalFileProvider
ir atiduoti env.WebRootFileProvider
.
Tik fizinio aplanko maršrutas gali būti perduotas paskutiniam,
StaticFileOptions.RequestPath
Neįmanoma nurodyti daugiau nei vieno, todėl nemanau, kad tai bus numatytas veiksmas.
*
env.WebRootFileProvider
Startup.Configure
gaunamasIWebHostEnvironment env
pagal metodą.
Paveldėkite IFileProvider ir sukurkite savo klases
ASP.NET failąProvider, nes jo negali palaikyti tik standartinės "Core" funkcijos.
using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Primitives;
namespace Microsoft.Extensions.FileProviders
{
<summary>
wwwroot フォルダ以外のファイルで "asp-append-version”を有効にするための複数の <see cref="StaticFileOptions"/> を管理するファイルプロバイダです。
</summary>
class CompositeStaticFileOptionsProvider : IFileProvider
{
private readonly IFileProvider _webRootFileProvider;
private readonly IEnumerable<StaticFileOptions> _staticFileOptions;
<summary>
コンストラクタです。
</summary>
<param name="webRootFileProvider">
デフォルトの wwwroot が設定されている WebRootFileProvider を指定します。通常は env.WebRootFileProvider を指定してください。
これは追加した <see cref="StaticFileOptions"/> がヒットしなかった場合に使用するためです。
</param>
<param name="staticFileOptions">
追加した静的ファイルオプションの一覧です。
FileProvider と RequestPath が設定されている必要があります。
</param>
public CompositeStaticFileOptionsProvider(IFileProvider webRootFileProvider, IEnumerable<StaticFileOptions> staticFileOptions)
{
_webRootFileProvider = webRootFileProvider ?? throw new ArgumentNullException(nameof(webRootFileProvider));
_staticFileOptions = staticFileOptions;
}
<summary>
指定されたパスにあるディレクトリを列挙します(存在する場合)。
</summary>
<param name="subpath">ディレクトリを識別する相対パス。</param>
<returns>ディレクトリの内容を返します。</returns>
public IDirectoryContents GetDirectoryContents(string subpath)
{
var result = GetFileProvider(subpath);
return result.FileProvider.GetDirectoryContents(result.StaticFileRelativePath);
}
<summary>
指定されたパスでファイルを見つけます。
</summary>
<param name="subpath">ファイルを識別する相対パス。</param>
<returns>ファイル情報。 発信者はExistsプロパティを確認する必要があります。</returns>
public IFileInfo GetFileInfo(string subpath)
{
var result = GetFileProvider(subpath);
return result.FileProvider.GetFileInfo(result.StaticFileRelativePath);
}
<summary>
指定されたフィルターの Microsoft.Extensions.Primitives.IChangeToken を作成します。
</summary>
<param name="filter">監視するファイルまたはフォルダーを決定するために使用されるフィルター文字列。 例:**/*.cs、*.*、subFolder/**/*.cshtml。</param>
<returns>ファイル一致フィルターが追加、変更、または削除されたときに通知される Microsoft.Extensions.Primitives.IChangeToken。</returns>
public IChangeToken Watch(string filter)
{
var result = GetFileProvider(filter);
return result.FileProvider.Watch(result.StaticFileRelativePath);
}
<summary>
指定された相対 URL に含まれる <see cref="StaticFileOptions"/> を探し、その FileProvider と静的ファイルへの相対パスを返します。
見つからなかった場合は wwwroot を持つ FileProvider を返します。
</summary>
<param name="path">アクセスされたホスト名以降の相対 URL。</param>
<returns>検索された <see cref="StaticFileOptions"/> の FileProvider と RequestPath から静的ファイルへの相対パス。</returns>
private (IFileProvider FileProvider, string StaticFileRelativePath) GetFileProvider(string path)
{
if (_staticFileOptions != null)
{
foreach (var option in _staticFileOptions)
{
// 登録している RequestPath とアクセスされた URL の大文字小文字が異なる場合があるので OrdinalIgnoreCase を指定
if (path.StartsWith(option.RequestPath, StringComparison.OrdinalIgnoreCase))
{
return (option.FileProvider, path[option.RequestPath.Value.Length..]);
}
}
}
return (_webRootFileProvider, path);
}
}
}
Kadangi jis yra ilgas, aš nepaaiškinsiu detalių, bet trumpai paaiškinsiu,
Pirma, StaticFileOptions
aš turiu visą sąrašą, kad aš sukūriau šioje klasėje.
Vėliau nustatysiu šią klasę env.WebRootFileProvider
į nuosavybę.
Kiekvienas metodas iškviečiamas, kai jį pasiekia klientas, todėl ieškokite, StaticFileOptions
kurį statinį failą pasiekėte pagal URL.
Grąžina StaticFileOptions
santykinį kelią į įvykusį ir FileProvider
statinį failą. Jei staticFileOptions nepaleidžiamas, wwwroot parametras taikomas grąžinant numatytąjį FileProvider.
Grąžinant teisingą kiekvienos operacijos failo informaciją asp-append-version
atsispindės atributas.
Beje, šis kodas gali būti bet kur.
Taikyti savo klasę (CompositeStaticFileOptionsProvider)
Startup.Configure
Išspręskime tai taip:
Kaip parašyta, nėra ką paaiškinti.
StaticFileOptions
Aš tik apibendrinsiu juos masyve.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// 省略
app.UseHttpsRedirection();
// ここから修正
var staticOptions = new StaticFileOptions[]
{
// Site1 用の物理コンテンツフォルダと参照 URL を紐づける
new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "Areas/Site1/Content")),
RequestPath = "/Site1",
},
// 複数ある場合はこんな感じで追加
//new StaticFileOptions()
//{
// FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "Areas/Site2/Content")),
// RequestPath = "/Site2",
//},
};
// wwwroot フォルダで静的ファイル参照を有効にする
app.UseStaticFiles();
// 追加したい StaticFileOptions
foreach (var option in staticOptions)
{
app.UseStaticFiles(option);
}
// StaticFileOptions を独自クラスでまとめて WebRootFileProvider にセットする
var compositeProvider = new CompositeStaticFileOptionsProvider(env.WebRootFileProvider, staticOptions);
env.WebRootFileProvider = compositeProvider;
// ここまで修正
app.UseRouting();
// 省略
}
Jei jį paleisite dabar, pamatysite, kad atributas atsispindi statiniuose asp-append-version
failuose, esančius ne wwwroot, o kituose aplankuose.