Asp-append-verzió alkalmazása a wwwroot mappában lévő statikus fájlokon kívül
Környezet
- Visual Stúdió
-
- Visual Studio 2019
- ASP.NET mag
-
- 3.1 (Borotva oldal, MVC)
A wwwroot mappán kívül elhelyezett statikus fájlok nem tükrözik az asp-append-verziót
app.UseStaticFiles
A metódusra StaticFileOptions
vonatkozó további hívás megadásával
Statikus fájlok is elhelyezhető mappákban más, mint wwwroot.
A wwwroot mappán kívül elhelyezett statikus fájlok, hivatkozások és parancsfájlcímkék
asp-append-version
Az attribútum beállítása nem ad verzióinformációkat az URL-címhez.
Megpróbálom. A fájlok a következő konfigurációkba vannak rendezve:
Startup.Configure
a Területek/Webhely1/Tartalom mappa közzétételének módszerét.
// wwwroot フォルダで静的ファイル参照を有効にする
app.UseStaticFiles();
// Site1 用の物理コンテンツフォルダと参照 URL を紐づける
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "Areas/Site1/Content")),
RequestPath = "/Site1",
});
A következő index.cshtml
kód lett hozzáadva a programhoz. Mindegyik asp-append-version
hozzáadódik.
<!-- ここから追加 -->
<!-- wwwroot のファイル -->
<img src="~/image/sample.png" asp-append-version="true" />
<!-- wwwroot 以外のファイル -->
<img src="~/site1/image/sample1.png" asp-append-version="true" />
<!-- ここからまで -->
Futtatáskor a kép megfelelően jelenik meg.
Ha azonban megnézi az oldal HTML-kódját, láthatja, hogy a karakterlánc csak a wwwrootban elhelyezett fájlokra bővül ki.
Az asp-append-verzió nem tükröződik
Ez attól függ, hogy a tulajdonság határozza meg, hogy az asp-append-verzió env.WebRootFileProvider
IFileProvider
tükröződik-e.
Alapértelmezés szerint a megadott wwwroot PhysicalFileProvider
úgy van beállítva, hogy más mappákban ne tükröződjön.
Van egy IFileProvider
osztály, amely egynél CompositeFileProvider
több
Akkor csomag több mint egy itt, PhysicalFileProvider
és adja meg a env.WebRootFileProvider
.
Csak egy fizikai mappa elérési útja továbbadható az utolsó,
StaticFileOptions.RequestPath
Ennél többet nem lehet megadni, ezért nem hiszem, hogy ez lesz a tervezett intézkedés.
*
env.WebRootFileProvider
Startup.Configure
módszerrelIWebHostEnvironment env
érkezik.
Örökölje az IFileProvidert, és hozzon létre saját osztályokat
ASP.NET fájlProvider, mert nem lehet támogatni a standard funkciók Core egyedül.
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);
}
}
}
Mivel hosszú, nem fogom megmagyarázni a részleteket, de röviden elmagyarázni,
Először StaticFileOptions
is, meg fogom az összes listát, amit ebben az osztályban készítettem.
Ezt az osztályt később env.WebRootFileProvider
egy ingatlanba állítom.
Minden metódus akkor hív meg, amikor egy ügyfél hozzáfér, ezért keresse StaticFileOptions
meg, hogy melyik statikus fájlt az URL-cím alapján.
A StaticFileOptions
találati és statikus fájl relatív elérési útját ad FileProvider
vissza. Ha a staticFileOptions nem találat, a wwwroot beállítás az alapértelmezett FileProvider visszaadja.
Az egyes műveletek megfelelő fájlinformálatának asp-append-version
visszaadása az attribútumot tükrözi.
By the way, ez a kód bárhol lehet.
Alkalmazza saját osztályát (CompositeStaticFileOptionsProvider)
Startup.Configure
Javítsuk meg a következőképpen:
Mint megírtuk, nincs mit megmagyarázni.
StaticFileOptions
Csak összefoglalom őket egy tömbben.
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();
// 省略
}
Ha most futtatja, láthatja, hogy az attribútum a asp-append-version
wwwroottól nem más mappákba helyezett statikus fájlokban jelenik meg.