۱۳۸۷/۰۹/۱۲

غيرفعال سازي كش مرورگر در مورد تصاوير ايستا


امروز هنگام نمايش تصاوير در يك گريد با مشكل زير مواجه شده بودم. (گرفتار شده بودم!!)
فرض كنيد يك فرم درست كرده‌ايد كه يك تصوير به همراه توضيحاتي توسط آن ثبت مي‌شود. جهت اطمينان خاطر ثبت كننده، تصاوير ثبت شده در يك گريد پائين فرم نمايش داده خواهند شد. نام اين تصاوير همواره ثابت است (براي مثال نام تصوير تشكيل شده است از يك شماره پروژه بعلاوه پسوند فايل).
مشكلي در ثبت تصاوير يا توضيحات آنها وجود نداشت. مشكل در اين بود كه پس از ويرايش ركورد و انتخاب تصويري جديد و ثبت آن، همان تصوير قبلي در مرورگر نمايش داده مي‌شد. اين مورد را مي‌شد با فشردن دكمه‌هاي ctrl+f5 حل كرد (به روز كردن كش مرورگر)، اما اين راه حل اصولي حل اين مشكل نيست. (تصورش را بكنيد كه به كاربر گفته شود پس از هر بار فشردن دكمه ثبت، يكبار هم دكمه‌هاي ctrl+f5 را فشار دهيد!)
راه ‌حل‌هاي استاندارد غيرفعال كردن كش در ASP.Net هم هيچكدام افاقه نكردند. تركيبي از موارد زير در page_load صفحه تست شدند:
            //do not cache...
Response.CacheControl = "no-cache";
Response.AddHeader("Pragma", "no-cache");
Response.Expires = -1;
Response.Cache.SetNoStore();
Response.Cache.SetCacheability(HttpCacheability.NoCache);

چون نام تصاوير تغييري نمي‌كرد، براي مثال 1234 هميشه همان 1234 باقي مي‌ماند (صرفنظر از محتواي جديد آن)، مرورگر اين تصوير غيرپويا را كش مي‌كرد و فقط با ctrl+f5 اين كش به روز مي‌شد. (روش فوق در مورد غيرفعال كردن كش كردن يك صفحه پوياي ASP.Net مؤثر است (براي مثال توصيه مي‌شود كه كش كردن صفحات لاگين را حتما به اين صورت غيرفعال كنيد)، اما در مورد اشياء غيرپوياي صفحه مطابق آزمايش من اثري نداشت)

اين مشكل به صورت زير حل شد: (يك ستون GridView است)
<asp:TemplateField HeaderText="لوگو">
<ItemTemplate>
<asp:Image ID="Image2" runat="server"
ImageUrl='<%# "pics/"+Eval("filename")+"?uid="+Guid.NewGuid().ToString("N") %>' />
</ItemTemplate>
<ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>

يك عبارت منحصر بفرد به صورت كوئري استرينگ به انتهاي نام تصوير اضافه شد. مشكلي هم در نمايش تصوير ايجاد نمي‌كند، مرورگر آن‌را يك تصوير جديد به حساب آورده و دوباره همان تصوير قبلي موجود در كش را نمايش نخواهد داد. (با IE و فايرفاكس تست شد و اينجا ديگر مهم نيست كه وضعيت تنظيمات به روز رساني كش مرورگرهاي تك تك كاربران به چه صورتي است و آيا بايد نگران همه‌ي آنها بود يا خير يا اين‌كه اصلا ارزش آن‌را دارد كه براي يك صفحه كلا كش مرورگر را غيرفعال كرد؟)

زمانيكه GridView رندر شود، تصوير ما به صورت زير خواهد بود:
<img id="GridView1__ctl2_Image2" src="pics/123456.PNG?uid=2a2c4247ae264ef49be46a2436ae03c9" border="0" />