PDA

View Full Version : اشکال در فشرده سازی صفحات با استفاده از gzip



Kia_MLS
سه شنبه 19 بهمن 1389, 14:46 عصر
با سلام
من در صفحاتم از روش فشرده سازی که آقای راد ارایه دادند استفاده کردم
اما مشکلی که برای بعضی از کاربرانم بوجو اومده اینه که صفحاتی که با gzip فشرده شده اند لود نمیشن :گریه:

طبق بررسی که انجام شد متوجه شدم این دسته از کاربران از اینترت Proxy استفاده میکنند. به عبارتی دیگر کاربرانی که از Nat استفاده میکنند یا Ip valid دارند بدون هیچ مشکلی سایت رو باز میکنند اما کاربران Proxy نمیتونن :گریه:

کدی که برای فشرده سازی صفحات استفاده کردم:


private static bool IsGZipSupported()
{
string AcceptEncoding = HttpContext.Current.Request.Headers["Accept-Encoding"];
if ( (AcceptEncoding != null || AcceptEncoding != "") &&
AcceptEncoding.Contains("gzip") || AcceptEncoding.Contains("deflate")
)
return true;
return false;
}
private static void GZipEncodePage()
{
if (IsGZipSupported())
{
HttpResponse Response = HttpContext.Current.Response;
string AcceptEncoding = HttpContext.Current.Request.Headers["Accept-Encoding"];

if (AcceptEncoding.Contains("gzip"))
{
Response.Filter = new System.IO.Compression.GZipStream(Response.Filter,
System.IO.Compression.CompressionMode.Compress);
Response.AppendHeader("Content-Encoding", "gzip");
}
else
{
Response.Filter = new System.IO.Compression.DeflateStream(Response.Filte r,
System.IO.Compression.CompressionMode.Compress);
Response.AppendHeader("Content-Encoding", "deflate");
}
}
}



پیشنهاد اساتید محترم برای رفع مشکل این دسته از کاربران چیه؟

prankster
سه شنبه 19 بهمن 1389, 20:35 عصر
واقعا کاری از دست شما ساخته نیست! این کاملا بستگی به نوع پیاده سازی Proxy Server دارد، معمولا Proxy Server هایی که به صورت HTTP Push اطلاعات را از سرور بارگزاری و آنرا برای کلاینت ها ارسال می کنند با Compression و Caching مشکل دارند و این مساله مشکل Proxy است نه برنامه.
چیزی که عملا اتفاق می افتد به این صورت است:
- کاربر به Proxy Server درخواست می دهد و به همراه درخواست در HTTP Header ارسال شده، نوع encoding قابل قبول در مرورگر را هم ارسال می کند
- Proxy Server این درخواست را برای سرور ارسال می کند (در همین نقطه Proxy Server ها می توانند HTTP Header را تغییر دهند به صورتی که encoding برای سرور ارسال نشود).
- سرور درخواست را دریافت می کند و آنرا به صورت فشرده شده برای Proxy بر می گرداند، در اینجا حالت های متفاوتی ممکن است اتفاق بیفتد، در صورتی که Proxy Server مثلا از روش Push کردن HTTP استفاده کرده باشد در این مرحله در صورتی که Proxy Server امکان extract کردن داشته باشد اطلاعات فشرده شده extract می شود (دقیقا عملکردی که در مرورگر اتفاق می افتد) و در صورتی که Proxy Server این امکان را نداشته باشد اطلاعات به صورت بیت های نامفهوم دریافت می شود! همچنین در صورتی که Proxy Server فقط کار Buffer انجام دهد اطلاعات دست نخورده برای کلاینت ارسال می شود.
- کلاینت اطلاعات را دریافت می کند و درصورتی که در HTTP Header دریافت شده روش Compression مشخص شده باشد آنرا extract می کند. نکته مهم اینجاست که در صورتی که Proxy Server قبلا عمل extract کردن را انجام داده باشد باید Content-Encoding در Header ارسال شده خالی شده باشد (کاری که خیلی از Proxy ها انجام نمی دهند) همچنین در غیر این صورت نباید Content-Encoding در Header ارسال شده به کلاینت تغییر کند - در صورتی که یکی از این موارد اتفاق بیفتد اطلاعات یا اصلا extract نمی شود و یا 2 بار extract خواهد شد و در این حالت کاربر وبسایت تنها یکسری متون به هم ریخته نامفهوم را مشاهده می کند!

Kia_MLS
چهارشنبه 20 بهمن 1389, 09:37 صبح
پس با این توضیحات جناب prankster عملا فشرده سازی صفحات به روش gzip امکان پذیر نیست

و این اصلا خوب نیست
آیا راهی وجود داره که تشخیص بدیم کاربری که الان صفحه ما رو درخواست کرده از چه نوع سروری استفاده میکنه؟ و بر اساس پاسخ این سوال تصمیم بگیریم صفحات رو با روش gzip فشرده بکنیم یا خیر؟