3

アセンブリに埋め込まれ、プロジェクト間で共有される、再利用可能な部分ビュー、スクリプト、および画像のライブラリがあります。

すべて正常に動作します。Web.config を変更して、必要なすべてのファイル タイプが System.Web.StaticFileHandler によって提供されるようにしましたが、残念ながら、すべてのリソースが Cache-Control: private で提供されます。

VPP コンテンツを提供する独自の StaticFileHandler を Cache-Control: public と有効期限で作成できます。

VirtualPathProvider.GetCacheDependency を使用してキャッシュ サポートを実装するにはどうすればよいですか?

4

2 に答える 2

5

なぜこれが起こるのか分かりました。StaticFileHandler のソースを調べました。埋め込みファイルの場合、キャッシュ ヘッダーは設定されません。ファイルシステム内のファイルに対してのみ行います。つまり、これは決して正しく機能しません。

2 つのオプションがあります。

1. 別の http ハンドラを見つけます。これを使用したことはありませんが、検索で出てきました: https://code.google.com/p/talifun-web/wiki/StaticFileHandler

2. 静的ファイル ハンドラーが使用されているかどうかを確認する http モジュールを作成します。使用されている場合は、キャッシュの詳細を設定します。

幸運を。

于 2013-04-30T19:20:45.967 に答える
3

私の調査に基づいて、キャッシングを実現するハックな方法を見つけました。

VPP 実装では、基本クラスVirtualFileを拡張して独自のクラスを実装する必要があります。System.Web.Hosting.VirtualFileVPP から必要な場合は、ストリームがファイルを読み取ることを期待しています。その段階で、ヘッダーを挿入したり、リソースのキャッシュ可能性を変更したりできます。以前は、VPP から静的ファイルを要求すると、ヘッダーが付いていたからCache-Control:privateです。実際、サーバーは次のように言っていました。ローカル キャッシュや etag などは気にしません。キャッシュするかどうかは私が決めます。以下のコードpublicは、アセンブリが変更されない限りキャッシュに残るように、必要な e-tag ヘッダーを変更して追加します。

ここに画像の説明を入力

class EmbeddedResourceVirtualFile : VirtualFile
{
    readonly EmbeddedResource embedded;

    public EmbeddedResourceVirtualFile(string virtualPath, EmbeddedResource embedded)
        : base(virtualPath)
    {
        this.embedded = embedded;
    }

    public override Stream Open()
    {
        var assemblyLastModified = embedded.AssemblyLastModified;
        var etag = assemblyLastModified.Ticks;
        var response = HttpContext.Current.Response;
        var cache = response.Cache;
        cache.SetCacheability(HttpCacheability.Public);
        cache.SetETag(etag.ToString());
        cache.SetLastModified(assemblyLastModified);
        cache.SetExpires(assemblyLastModified.AddYears(2));
        return embedded.GetStream();
    }
}

コメンターに感謝します:)

于 2016-05-05T16:06:04.193 に答える