2012-10-11 8 views
5

FileStreamResult döndüren bir MVC4 GET eylem yöntemim var. Bu beklendiği gibi davranır ve şu yanıtı üretirSetCacheability yöntemiyle ayarlandıktan sonra bir Pragma önbellek yanıtı üstbilgisini kaldırmak mümkün mü?

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None", Location = OutputCacheLocation.None)] 

: Bir gereklilik sadece SSL kullanmak ve sunulan belgenin önbelleğe bu yüzden ve ben de aşağıdaki özelliklere sahip OutputCache filtreyi kullandım SSL izin vermemeyi için var başlıklar:

Cache-Control: no-cache, no-store 
Expires: -1 
Pragma: no-cache 

da IE8 desteklemek için istedi ve burada birçok da belgeler sadece mix ayarlanır no-cache ve SSL hem indirmek olmayacak karşılaştım kadar bütün iyi oldu. IE8 ve aşağıdaki için geçerli olan çözüm, gerçekten uygun olmayan bazı kayıt defteri ayarlarının eklenmesi veya temel gereksinimi ortadan kaldıran önbellek başlıklarının kaldırılmasıdır.

Fiddler ve IE8 ile deneme yaptım ve pragma: no-cache üstbilgisini kaldırdım, ancak Önbelleği Denetimi bozulmadan bıraktıysam bir belge indirebildim. Bu, geçici internet dosyamda belgenin bir kopyasını bırakmadı gibi görünüyor, ancak bunu biraz daha test etmem gerekebilir.

Bu bilgiler göz önüne alındığında, pragmanın eylem üzerinde bir filtre kullanarak kaldırılmasının basit bir görev olabileceğini düşündüm ancak ne yaptığım önemli değil, Çıktının ne yapacağı değişirse değiştiremiyorum. Hatta OutputCache özniteliği kaldırılır ve kullandım:

Response.Cache.SetCacheability(HttpCacheability.NoCache) 

bu yöntem tek başına ben daha önce olduğu gibi aynı önbellek ayarlarını almak ama bu yöntem çağrısının noktasında ayarlanmamış sağlar kullanma. Bu sadece yanıt boru hattında bir noktada uygulanan önbellek politikasını kurar ama ben sadece nerede olduğunu bilmiyorum.

Önbellek başlıklarını yazılırken değiştirmek için yanıt boru hattına takmanın bir yolu olup olmadığını bilen var mı?

DÜZENLEME ben arar ve tepki NameValueCollection herhangi Pragma başlığını kaldırır ve önbelleği kontrol ayarlanır iken Pragma yoktur boru hattına basit bir özel IHttpModule ekledik. Bu, IIS 7.5'in pragmanın kendisini önbellek denetiminde gördükleri duruma göre eklediği anlamına mı geliyor? Eminim, basit bir web sitesi için varsayılanların ötesine hiçbir şey koymadım.

DÜZENLEME modülü içinde Cache-Control başlık değeri Kontrol ve önbellek başlıkları henüz yanıt uygulanan edilmemiştir yüzden özel ayarlanır. Yani modüller çalıştırıldıktan sonra önbellek başlıklarının eklenmesi görünebilir mi?

+0

FWIW, bunu okumak isteyebilirsiniz: http://blogs.msdn.com/b/ieinternals/archive/2009/10/03/internet-explorer-cannot-download-over-https-when-no- cache.aspx. Önbellek başlıkları ayarlanmamış olsa bile, yanıt genellikle diskte geçici bir dosyada olur; İdeal olarak kısa sürede temizlenecek, ama bunun garantisi yok. – EricLaw

+0

Teşekkürler EricLaw. Aramalarımda bu makaleye rastladım. Bu, tarayıcının akışı almasından önce yanıt başlıklarını değiştirmek için kemancıyı kullanmamı istedi. Ben sadece pragma dahil değil ama önbellek denetimini bırakarak dosyanın indirilmesini ancak Temp Internet Files klasöründe göremediğimi fark ettim. Hala bir yerde önbelleğe alınmadığından emin olmak için bunu tekrar test etmem gerektiğini düşünüyorum. – Mark

+0

[Benzer bir sorun] (http://stackoverflow.com/questions/13119340/ie6-8-unable-to-download-file-from-https-site) var ve yanıtı yapmanın bir yolunu bulamadım .Cache.SetCacheability' çalışması - her zaman "Pragma" üstbilgisini ekler ve her zaman "no-cache" 'no-store' yerine koyar. Kontrol edilebilir olmalıydı - IE3/Netscape Navigator ile uğraşmadıkça 'Pragma' başlığını göndermek oldukça anlamsız. – Keith

cevap

0

Aynı sorunu gideriyordum ve aynı sorunu pragma üstbilgisini kaldırıyordum. .NET bir Sayfa nesnesi oluşturduğunda, önbellek başlıklarını çıkarır. Önbellek kullanımı bir HttpModule tarafından kontrol edilir. Ben pragma üstbilgisini kaldırmak için çeşitli yollar denedim, ama boşuna.

Henüz denemediğim bir yöntem işe yarayabilir gibi görünüyor, ancak bir PITA'nın Response.Filter = new MyCustomFilter(...) aracılığıyla Response çıkış akışında bir filtre uygulamak olduğu anlaşılıyor.

Bundan önce, başlıkları çeşitli konumlarda kontrol etmeye çalıştım, ancak çıktı önbelleği işlemesi henüz gerçekleştirilmemiş ve pragma başlığı mevcut değildi ve bu nedenle kaldırılamadı. Özellikle HttpApplication olayı PreSendRequestHeaders çalışmadı.

Bazı diğer seçenekler, yerleşik çerçeve sürümünü kullanmak yerine kendi OutputCache modülünü uygulamak veya pragma üstbilgisinin oluşturulduğu System.Web.HttpCachePolicy sınıfını bir şekilde geçersiz kılmaktır.

if (httpCacheability == HttpCacheability.NoCache || httpCacheability == HttpCacheability.Server) 
    { 
    if (HttpCachePolicy.s_headerPragmaNoCache == null) 
     HttpCachePolicy.s_headerPragmaNoCache = new HttpResponseHeader(4, "no-cache"); 
    this._headerPragma = HttpCachePolicy.s_headerPragmaNoCache; 
    if (this._allowInHistory != 1) 
    { 
     if (HttpCachePolicy.s_headerExpiresMinus1 == null) 
     HttpCachePolicy.s_headerExpiresMinus1 = new HttpResponseHeader(18, "-1"); 
     this._headerExpires = HttpCachePolicy.s_headerExpiresMinus1; 
    } 
    } 

buldum tek pragmatik seçenek özel Önbellek kontrolünü ayarlamak ve aynı zamanda kısa bir süre sonu ayarlayın:

Pragma başlık HttpCacheability.NoCache seçeneği bir parçası olarak oluşturulur URL. Her iki uçtaki kök nedenleri ele almaz, ancak neredeyse aynı istenen etkiyle sonuçlanır.

İlgili konular