Сохранение свойства элемента управления кэшем для файла, когда он возвращается как поток из VirtualPathProvider - PullRequest
0 голосов
/ 22 ноября 2011

Я реализовал VirtualPathProvider для возврата файлов тем (изображений, css) для веб-сайта Azure из Azure CDN. Он отлично работает, кроме одной вещи: все файлы, поступающие из CDN, имеют свойство управления кэшем, установленное на "private", и поэтому никогда не кэшируются.

У реальных BLOB-объектов их свойства установлены правильно, и если я обращаюсь к ним по прямому URL-адресу (т. Е. Не через VPP), то управление кешем является правильным.

Кажется, проблема в методе Open () класса VirtualFile, который я должен реализовать, чтобы вернуть файл в виде потока?

public override Stream Open()
    {
        CloudBlobClient client = new CloudBlobClient(cdnURL);
        CloudBlob blob = client.GetBlobReference(blobURL);
        blob.FetchAttributes();
        MemoryStream stream = new MemoryStream();
        BlobRequestOptions options = new BlobRequestOptions();
        options.BlobListingDetails = BlobListingDetails.Metadata;
        blob.DownloadToStream(stream,options);
        stream.Seek(0, SeekOrigin.Begin);
        return stream;
    }

Поиск по этому вопросу, и я обнаружил, что большинство людей сталкиваются с проблемой по-другому - то есть файлы кэшируются, когда они этого не хотят. Однако ни один из примеров, которые я могу найти, не ссылается на файл с другого URL. Кажется, они все используют базы данных или просто разные физические пути.

Ответы [ 2 ]

2 голосов
/ 14 декабря 2011

Благодаря этому ответу на форуме asp.net http://forums.asp.net/post/4716700.aspx

Я решил проблему, добавив в метод Open ():

HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public);
HttpContext.Current.Response.Cache.AppendCacheExtension("max-age=86400");
1 голос
/ 23 ноября 2011

Я думаю, что вы, возможно, упустили важный момент в том, как CDN получает свое преимущество.CDN помогает, размещая ресурсы ближе к клиенту, запрашивающему файл.то есть, когда клиент запрашивает файл, он идет прямо к URL CDN.Кажется, здесь происходит то, что вы загружаете файл из CDN в код, на котором работает веб-сервер, а затем возвращаете поток клиенту оттуда.

Пожалуйста, исправьте меня, если я ошибаюсь.

Стоит также отметить, что свойства кэша не являются частью возвращаемого вами потока файлов, это дополнительные свойства, которые можно найти в CloudBlob.Properties.CacheControl

...