Wwwroot klasöründeki statik dosyalara ek olarak ASP-Append sürümünü uygula
Ortam
- Visual Studio
-
- Visual Studio 2019
- ASP.NET Çekirdek
-
- 3.1 (Razor sayfası, MVC)
Wwwroot klasörünün dışına yerleştirilen statik dosyalar ASP-Append-Version'u yansıtmıyor
app.UseStaticFiles
Yönteme ek bir çağrı belirterek StaticFileOptions
Statik dosyalar wwwroot dışındaki klasörlere de yerlenebilir.
Ancak, wwwroot klasörünün, bağlantının ve komut dosyası etiketlerinin dışına yerleştirilen statik dosyalar için
asp-append-version
Özniteliği ayarlamak URL'ye sürüm bilgisi eklemez.
Bir deneyeyim. Dosyalar aşağıdaki yapılandırmalarda düzenlenmiştir:
Startup.Configure
Areas/Site1/Content klasörünü de yayımlama yöntemi.
// wwwroot フォルダで静的ファイル参照を有効にする
app.UseStaticFiles();
// Site1 用の物理コンテンツフォルダと参照 URL を紐づける
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "Areas/Site1/Content")),
RequestPath = "/Site1",
});
'ye aşağıdaki index.cshtml
kod eklenmiştir. Her asp-append-version
biri eklenir.
<!-- ここから追加 -->
<!-- wwwroot のファイル -->
<img src="~/image/sample.png" asp-append-version="true" />
<!-- wwwroot 以外のファイル -->
<img src="~/site1/image/sample1.png" asp-append-version="true" />
<!-- ここからまで -->
Çalıştırdığınızda, görüntü doğru görüntülenir.
Ancak, sayfanın HTML'sine bakarsanız, dizenin yalnızca wwwroot'a yerleştirilen dosyalara genişletildiğini görebilirsiniz.
ASP-append-version yansıtılmış olmadığında neden olur
Asp-append-version'un env.WebRootFileProvider
yansıtılıp yansıtılamayacağını belirleyen özelliğe IFileProvider
bağlıdır.
Varsayılan olarak, belirtilen wwwroot PhysicalFileProvider
diğer klasörlere yansıtılmayacak şekilde ayarlanır.
Birden fazla IFileProvider
sınıfa sahip olabilecek bir sınıf var CompositeFileProvider
Burada birden fazla PhysicalFileProvider
env.WebRootFileProvider
paketleyip.
Yalnızca fiziksel bir klasör yolu son klasöre geçirilebilir,
StaticFileOptions.RequestPath
Birden fazla belirtmek mümkün değildir, bu yüzden amaçlanan eylem olacağını sanmıyorum.
*
env.WebRootFileProvider
Startup.Configure
IWebHostEnvironment env
yöntemle alınır.
IFileProvider'ı devralın ve kendi sınıflarınızı oluşturun
ASP.NET yalnızca Core'daki standart özellikler tarafından desteklenemediğinden fileProvider dosyası.
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);
}
}
}
Uzun olduğu için, detayları açıklamam, ama kısaca açıklamak gerekirse,
İlk olarak, StaticFileOptions
bu sınıfta oluşturduğum tüm listeyi alacağım.
Bu sınıfı daha env.WebRootFileProvider
sonra bir mülke ayarlayacağım.
Her yöntem bir istemci tarafından erişildiğinde çağrılır, bu nedenle StaticFileOptions
URL'ye göre hangi statik dosyaya eriştiğinizi arayın.
StaticFileOptions
isabet ve statik dosyanın göreli yolunu döndürür. FileProvider
StaticFileOptions isabet almazsa, wwwroot ayarı varsayılan FileProvider döndürülerek uygulanır.
Her işlem için doğru dosya bilgilerini döndürmek asp-append-version
özniteliği yansıtır.
Bu arada, bu kod her yerde olabilir.
Kendi sınıfınızı uygulama (CompositeStaticFileOptionsProvider)
Startup.Configure
Aşağıdaki gibi düzeltelim:
Yazıldığı gibi, açıklanacak bir şey yok.
StaticFileOptions
Onları bir diziyle özetliyorum.
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();
// 省略
}
Şimdi çalıştırırsanız, özniteliğin wwwroot dışındaki klasörlere yerleştirilen statik dosyalara yansıdığını asp-append-version
görebilirsiniz.