Приложи asp-append-version в допълнение към статичните файлове в папката wwwroot
Околната среда
- Визуално студио
-
- Изглед от 10 до 2008
- ASP.NET ядро
-
- 3.1 (Страницата на Бръснача, MVC)
Статичните файлове, поставени извън папката wwwroot, не отразяват asp-append-версия
app.UseStaticFiles
Чрез задаване на допълнително StaticFileOptions
повикване към метода
Статичните файлове могат да бъдат поставени и в папки, различни от wwwroot.
Обаче за статични файлове, поставени извън папката wwwroot, връзка и скрипт тагове
asp-append-version
Задаването на атрибут не добавя информация за версията на URL адреса.
Ще го пробвам. Файловете са подредени в следните конфигурации:
Startup.Configure
също така да публикувате папката Области/Site1/Съдържание.
// wwwroot フォルダで静的ファイル参照を有効にする
app.UseStaticFiles();
// Site1 用の物理コンテンツフォルダと参照 URL を紐づける
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "Areas/Site1/Content")),
RequestPath = "/Site1",
});
Следният index.cshtml
код е добавен към . asp-append-version
Всеки от тях се добавя.
<!-- ここから追加 -->
<!-- wwwroot のファイル -->
<img src="~/image/sample.png" asp-append-version="true" />
<!-- wwwroot 以外のファイル -->
<img src="~/site1/image/sample1.png" asp-append-version="true" />
<!-- ここからまで -->
Когато го стартирате, изображението се показва правилно.
Ако погледнете HTML на страницата, обаче, можете да видите, че низа се разгръща само до файловете, поставени в wwwroot.
Причините, когато asp-append-версия не е отразено
Това зависи от свойството, което определя дали asp-прикрепяне-версия env.WebRootFileProvider
е IFileProvider
отразено.
По подразбиране зададеният wwwroot PhysicalFileProvider
е зададен така, че да не се отразява в други папки.
Има един IFileProvider
клас, който може да има повече от CompositeFileProvider
един
Можете да опаковате повече от един тук PhysicalFileProvider
и да го дадете на env.WebRootFileProvider
.
Само физически път на папка може да бъде предаден на последната,
StaticFileOptions.RequestPath
Не е възможно да се посочат повече от един, така че не мисля, че това ще бъде планираното действие.
*
env.WebRootFileProvider
се получава поStartup.Configure
IWebHostEnvironment env
метод.
Наследете IFileProvider и създайте свои собствени класове
ASP.NET fileProvider, защото не може да бъде поддържан от стандартните функции в core.
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);
}
}
}
Защото е дълго, няма да обяснявам детайлите, а да обясня накратко,
Първо, StaticFileOptions
ще имам целия списък на, който съм създал в този клас.
Ще зададем този клас env.WebRootFileProvider
на имот по-късно.
Всеки метод се нарича, когато клиентът е достъпен, така StaticFileOptions
че потърсете кой статичен файл сте осъществили достъп въз основа на URL адреса.
Връща StaticFileOptions
относителния път до статичния и статичен FileProvider
файл. Ако staticFileOptions не е текно, настройката за wwwroot се прилага чрез връщане на FileProvider по подразбиране.
Връщането на правилната информация за файловете за всяка операция asp-append-version
ще отразява атрибута.
Между другото, този код може да бъде навсякъде.
Прилагане на ваш собствен клас (Композитен статиченФайлОпцииПроиздател)
Startup.Configure
Нека да го оправим, както следва:
Както е написано, няма какво да се обясни.
StaticFileOptions
Просто ги обобщавам в масив.
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();
// 省略
}
Ако го стартирате сега, можете да видите, че атрибутът се отразява в статични asp-append-version
файлове, поставени в папки, различни от wwwroot.