Εφαρμογή έκδοσης προσαρτημάτων ASP εκτός από στατικά αρχεία στο φάκελο wwwroot

Ημερομηνία δημιουργίας σελίδας :

Περιβάλλον

Οπτικό Στούντιο
  • Οπτικό Στούντιο 2019
ASP.NET Πυρήνας
  • 3.1 (Σελίδα ξυραφιών, MVC)

Τα στατικά αρχεία που τοποθετούνται εκτός του φακέλου wwwroot δεν αντικατοπτρίζουν την έκδοση asp-append

app.UseStaticFiles Καθορίζοντας μια πρόσθετη StaticFileOptions κλήση στη μέθοδο Στατικά αρχεία μπορούν επίσης να τοποθετηθούν σε φακέλους εκτός του wwwroot. Ωστόσο, για στατικά αρχεία που τοποθετούνται εκτός του φακέλου wwwroot, οι ετικέτες συνδέσεων και δεσμών ενεργειών asp-append-version Η ρύθμιση του χαρακτηριστικού δεν προσθέτει πληροφορίες έκδοσης στη διεύθυνση URL.

Θα κάνω μια προσπάθεια. Τα αρχεία τακτοποιούνται στις ακόλουθες ρυθμίσεις παραμέτρων:

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" />

<!-- ここからまで -->

Όταν την εκτελείτε, η εικόνα εμφανίζεται σωστά.

Ωστόσο, αν κοιτάξετε την HTML της σελίδας, μπορείτε να δείτε ότι η συμβολοσειρά επεκτείνεται μόνο στα αρχεία που τοποθετούνται στο wwwroot.

Αιτίες όταν δεν αντικατοπτρίζεται η έκδοση asp-append

Εξαρτάται από την ιδιότητα που καθορίζει αν θα αντικατοπτρίζεται η έκδοση asp-append. env.WebRootFileProvider IFileProvider Από προεπιλογή, το καθορισμένο wwwroot PhysicalFileProvider έχει οριστεί έτσι ώστε να μην αντικατοπτρίζεται σε άλλους φακέλους.

Υπάρχει μια τάξη IFileProvider που μπορεί να έχει περισσότερες από CompositeFileProvider μία Μπορείτε να συσκευάσετε περισσότερα από ένα εδώ PhysicalFileProvider και να το δώσετε στο env.WebRootFileProvider . Μόνο μια διαδρομή φυσικού φακέλου μπορεί να περάσει στο τελευταίο, StaticFileOptions.RequestPath Δεν είναι δυνατόν να προσδιοριστούν περισσότερες από μία, επομένως δεν πιστεύω ότι θα είναι η επιδιωκόμενη δράση.

* env.WebRootFileProvider Startup.Configure λαμβάνεται με IWebHostEnvironment env τη μέθοδο.

Κληρονομήστε το IFileProvider και δημιουργήστε τις δικές σας τάξεις

ASP.NET αρχείοProvider επειδή δεν μπορεί να υποστηριχθεί από τυπικές δυνατότητες μόνο στον Πυρήνα.

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 εφαρμόζεται επιστρέφοντας το προεπιλεγμένο Πρόγραμμα δημιουργίας αρχείων.

Η επιστροφή των σωστών πληροφοριών αρχείου για κάθε λειτουργία 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.