ڈبلیو روٹ فولڈر میں جامد مسلیں کے علاوہ اے ایس پی-ایپنڈ ورژن لگائیں
ماحول
- بصری سٹوڈیو
-
- ویژیول سٹوڈیو 2019
- ASP.NET کور
-
- 3.1 (ریزر صفحہ، ایم وی سی)
ڈبلیو روٹ پوشہ کے باہر رکھی گئی جامد مسلیں اسپ-ضمیمہ ورژن کی عکاسی نہیں کرتی ہیں
app.UseStaticFiles
طریقہ کار پر اضافی کال کی تخصیص کرتے ہوئے StaticFileOptions
جامد مسلیں ڈبلیو روٹ کے علاوہ دیگر پوشوں میں بھی رکھی جا سکتی ہیں۔
تاہم، ڈبلیو روٹ فولڈر، لنک اور اسکرپٹ ٹیگز کے باہر رکھی گئی جامد فائلوں کے لیے
وصف سیٹ کرنے سے یو آر ایل میں asp-append-version
ورژن معلومات کا اضافہ نہیں ہوتا۔
میں اسے ایک کوشش کروں گا. مسلیں درج ذیل تشکیلات میں ترتیب دی گئی ہیں:
Startup.Configure
علاقہ جات/سائٹ1/مشمول پوشہ بھی شائع کرنے کا طریقہ۔
// 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" />
<!-- ここからまで -->
جب آپ اسے چلاتے ہیں تو تصویر کو صحیح طور پر دکھایا جاتا ہے۔
تاہم اگر آپ صفحہ کے ایچ ٹی ایم ایل پر نظر ڈالیں تو آپ دیکھ سکتے ہیں کہ سٹرنگ کو صرف ڈبلیو روٹ میں رکھی گئی فائلوں تک بڑھایا گیا ہے۔
وجوہات جب اے ایس پی-ایپنڈ ورژن کی عکاسی نہیں کی جاتی
یہ اس پراپرٹی پر منحصر ہے جو اس بات کا تعین کرتی ہے کہ آیا ایس پ-ایپنڈ ورژن env.WebRootFileProvider
کی عکاسی ہوتی ہے یا IFileProvider
نہیں۔
طے شدہ طور پر، اختصاصی ڈبلیو ڈبلیو روٹ PhysicalFileProvider
سیٹ کیا گیا ہے تاکہ یہ دیگر پوشوں میں منعکس نہ ہو۔
ایک کلاس ہے جس میں IFileProvider
ایک سے زیادہ ہو سکتے ہیں CompositeFileProvider
آپ یہاں ایک سے زیادہ پیک کر سکتے ہیں اور اسے دے سکتے PhysicalFileProvider
env.WebRootFileProvider
ہیں۔
صرف ایک جسمانی پوشہ راستہ آخری تک منتقل کیا جا سکتا ہے،
ایک سے زیادہ کی StaticFileOptions.RequestPath
تخصیص کرنا ممکن نہیں ہے، لہذا میں نہیں سمجھتا کہ یہ مقصود عمل ہوگا۔
*
env.WebRootFileProvider
Startup.Configure
طریقہ سے وصول کیا جاتاIWebHostEnvironment env
ہے.
آئی فائل فراہم کنندہ وراثت میں حاصل کریں اور اپنی کلاسیں بنائیں
ASP.NET مسل مہیا کار کیونکہ اسے صرف کور میں معیاری خصوصیات کی مدد نہیں کی جا سکتی۔
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
ہے۔
ہٹ اور جامد فائل پر نسبتی راستہ واپس کرتا StaticFileOptions
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
علاوہ دیگر فولڈرز میں رکھی جامد فائلوں میں منعکس ہوتا ہے۔