Asp-append-version käyttäminen wwwroot-kansion staattisten tiedostojen lisäksi
Ympäristö
- Visuaalinen studio
-
- Visual Studio 2019
- ASP.NET ydin
-
- 3.1 (Partaveitsisivu, MVC)
Wwwroot-kansion ulkopuolelle sijoitetut staattiset tiedostot eivät vastaa asp-append-versiota
app.UseStaticFiles
Määrittämällä StaticFileOptions
menetelmälle lisäkutsun
Staattiset tiedostot voidaan sijoittaa myös muihin kansioihin kuin wwwroot.
Kuitenkin staattisissa tiedostoissa, jotka sijoitetaan wwwroot-kansion ulkopuolelle, linkki- ja komentosarjatunnisteet
asp-append-version
Määritteen määrittäminen ei lisää versiotietoja URL-osoitteeseen.
Kokeilen sitä. Tiedostot on järjestetty seuraaviin kokoonpanoihin:
Startup.Configure
tapa julkaista myös Alueet/Sivusto1/Sisältö-kansio.
// wwwroot フォルダで静的ファイル参照を有効にする
app.UseStaticFiles();
// Site1 用の物理コンテンツフォルダと参照 URL を紐づける
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "Areas/Site1/Content")),
RequestPath = "/Site1",
});
Seuraava index.cshtml
koodi on lisätty -ylle. Jokainen asp-append-version
lisätään.
<!-- ここから追加 -->
<!-- wwwroot のファイル -->
<img src="~/image/sample.png" asp-append-version="true" />
<!-- wwwroot 以外のファイル -->
<img src="~/site1/image/sample1.png" asp-append-version="true" />
<!-- ここからまで -->
Kun suoritat sen, kuva näkyy oikein.
Jos kuitenkin tarkastelet sivun HTML-koodia, näet, että merkkijono on laajennettu vain wwwroot-kansioon sijoitettuihin tiedostoihin.
Syyt, kun asp-append-versio ei näy
Se riippuu ominaisuudesta, joka määrittää, näkyykö asp-append-versio. env.WebRootFileProvider
IFileProvider
Oletusarvon mukaan määritetty PhysicalFileProvider
wwwroot on määritetty niin, että se ei näy muissa kansioissa.
On luokka, IFileProvider
jossa voi olla useampi kuin yksi CompositeFileProvider
Voit pakata tänne useamman kuin yhden PhysicalFileProvider
ja antaa env.WebRootFileProvider
sen.
Vain fyysinen kansiopolku voidaan siirtää viimeiseen,
StaticFileOptions.RequestPath
Ei ole mahdollista määritellä enempää kuin yksi, joten en usko, että se on aiottu toimi.
*
env.WebRootFileProvider
Startup.Configure
vastaanotetaanIWebHostEnvironment env
menetelmällä.
Peri IFileProvider ja luo omia luokkia
ASP.NET fileProvider, koska pelkästään Coren vakio-ominaisuudet eivät tue sitä.
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);
}
}
}
Koska se on pitkä, en selitä yksityiskohtia, vaan selitän lyhyesti:
Ensin StaticFileOptions
minulla on kaikki lista, jonka loin tällä luokalla.
Asetan tämän luokan env.WebRootFileProvider
kiinteistöön myöhemmin.
Kutakin menetelmää kutsutaan, kun asiakas käyttää sitä, joten etsi, StaticFileOptions
mitä staattista tiedostoa olet käyttää URL-osoitteen perusteella.
Palauttaa StaticFileOptions
osumatiedoston ja staattisen tiedoston suhteellisen FileProvider
polun. Jos staticFileOptions ei osu, wwwroot-asetus otetaan käyttöön palauttamalla oletusarvoinen FileProvider.
Kun palautat kunkin toiminnon oikeat asp-append-version
tiedostotiedot, määrite otetaan huomioon.
Muuten, tämä koodi voi olla missä tahansa.
Käytä omaa luokkaasi (CompositeStaticFileOptionsProvider)
Startup.Configure
Korjataan se seuraavasti:
Kuten kirjoitettu, ei ole mitään selitettävää.
StaticFileOptions
Tiivistän ne matriisiin.
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();
// 省略
}
Jos suoritat sen nyt, voit nähdä, että määrite näkyy staattisissa tiedostoissa, jotka asp-append-version
on sijoitettu muihin kansioihin kuin wwwroot-kansioon.