0

Azure Blob Storage から画像をプルできるVirtualPathProviderのカスタム実装を作成しました。プロバイダーはその役割GetFileを果たしますが、すべての要求を呼び出すため、パフォーマンスが向上しません。

GetFile

public override VirtualFile GetFile(string virtualPath)
{
    string path = this.FormatVirtualPath(virtualPath);
    if (!path.StartsWith(this.pathPrefix, StringComparison.InvariantCultureIgnoreCase))
    {
        return base.GetFile(virtualPath);
    }

    string fileSystemPath = this.RemovePathPrefix(path);
    return new FileSystemVirtualFile(
                       virtualPath, 
                       () =>
                       this.fileSystem.Value.OpenFile(fileSystemPath));
}

ブロブの最終更新日を知っているので、キャッシュを少し追加することをお勧めしますが、何も機能していないようです。

GetCacheDependencyそれを読んで、メソッドをオーバーライドする必要があるGetFileHashようで、次のようにしました。

GetCacheDependency

public override CacheDependency GetCacheDependency(string virtualPath,
                                  IEnumerable virtualPathDependencies, 
                                  DateTime utcStart)
{
    string path = this.FormatVirtualPath(virtualPath);

    if (!path.StartsWith(this.pathPrefix, StringComparison.InvariantCultureIgnoreCase))
    {
        return base.GetCacheDependency(virtualPath, 
                                       virtualPathDependencies, 
                                       utcStart);
    }

    return new BlobCacheDependency(
                                 this.fileSystem
                                     .Value.GetLastModified(path)
                                     .DateTime.ToUniversalTime());
}

GetFileHash

public override string GetFileHash(string virtualPath, IEnumerable virtualPathDependencies)
{
    string path = this.FormatVirtualPath(virtualPath);
    if (!path.StartsWith(this.pathPrefix, StringComparison.InvariantCultureIgnoreCase))
    {
        return base.GetFileHash(virtualPath, virtualPathDependencies);
    }

    byte[] bytes = Encoding.Unicode.GetBytes(virtualPath.ToCharArray());

    using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
    {
        byte[] hash = md5.ComputeHash(bytes);

        // Concatenate the hash bytes into one long String.
        return hash.Aggregate(
            new StringBuilder(32),
            (sb, b) => sb.Append(b.ToString("X2",
                                 CultureInfo.InvariantCulture)))
            .ToString().ToLowerInvariant();
    }
}

カスタムCacheDependency実装もあります。

public class BlobCacheDependency : CacheDependency
{
    public BlobCacheDependency(DateTime lastModifiedUtc)
    {
        this.SetUtcLastModified(lastModifiedUtc);
    }
}

残念ながら、画像を要求するときに他のメソッドが呼び出されることはありません。何が欠けているのかわからない。何か案は?

4

1 に答える 1

1

これに対する答えは、実装のOpen()メソッド内に応答キャッシュを設定することです。VirtualFileこれにより、ブラウザはファイルをキャッシュできます。

少しハッキーですが、機能します。私のコードでは、今このように見えます。

public override Stream Open()
{
    // Set the response headers here. It's a bit hacky.
    HttpCachePolicy cache = HttpContext.Current.Response.Cache;
    cache.SetCacheability(HttpCacheability.Public);
    cache.VaryByHeaders["Accept-Encoding"] = true;

    IFileSystem azureBlobFileSystem = FileSystemProviderManager.Current.GetUnderlyingFileSystemProvider("media");
    int maxDays = ((AzureBlobFileSystem)azureBlobFileSystem).FileSystem.MaxDays;

    cache.SetExpires(DateTime.Now.ToUniversalTime().AddDays(maxDays));
    cache.SetMaxAge(new TimeSpan(maxDays, 0, 0, 0));
    cache.SetRevalidation(HttpCacheRevalidation.AllCaches);

    return this.stream();
}

見る

http://forums.asp.net/t/1745003.aspx?VirtualPathProvider+files+do+not+have+cache+control+headers

于 2015-06-18T23:06:44.110 に答える