22/5/56
Action Filter with HTTP-Compression
ในการรับส่งข้อมูลโดยทั่วไปเริ่มต้นจากการเกิด HTTP Request ข้อมูลไปยัง Web Server ซึ่งถ้า Request มีขนาดใหญ่ก็จะเกิดปัญหาตามมาก็คือใช้เวลาในการทำงานนาน อีกวิธีที่ช่วยลดขนาดของ Request ก็คือ HTTP-Compression พูดง่ายๆก็คือ การบีบอัดข้อมูลให้มีขนาดเล็กลงก่อนที่จะทำการส่ง Request ไปยัง Web Servers จึงช่วยลดขนาดของ Bandwidth และเพิ่มประสิทธิภาพความเร็วในการรับ-ส่งข้อมูลระหว่าง Web Servers และ Clients ซึ่งมีรูปแบบของการ Compress 3 รูปแบบ คือ GZip , Compress , Deflate ในส่วนของการพัฒนาด้วย C# ต้อง Run ผ่าน Internet Information Service (IIS) ซึ่งรองรับทั้ง GZip ละ Deflate ตัวอย่างนี้จะลองประยุกต์ใช้ HTTP-Compression ผ่านการทำ AcionFilter ของ MVC นะครับ
เริ่มแรกสร้างโปรเจค MVC ขึ้นมา สร้าง Folder Filters สร้าง Class ชื่อ CompressFilter ในส่วนบนสุดให้ทำการ using System.Web.Mvc; เพื่อให้สามารถ Inherit ActionFilterAttribute ได้ ดังรูป
จากนั้นจะได้ให้เขียน Code ดังนี้
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.IO.Compression;
namespace MvcApplication1.Filters
{
/// <summary>
/// Compresiion Filter Request
/// </summary>
public class CompressFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpRequestBase request = filterContext.HttpContext.Request;
string acceptEncoding = request.Headers["Accept-Encoding"];
if (string.IsNullOrEmpty(acceptEncoding)) return;
acceptEncoding = acceptEncoding.ToUpperInvariant();
HttpResponseBase response = filterContext.HttpContext.Response;
if (acceptEncoding.Contains("GZIP"))
{
response.AppendHeader("Content-encoding", "gzip");
response.Filter = new GZipStream(response.Filter
, CompressionMode.Compress);
}
else if (acceptEncoding.Contains("DEFLATE"))
{
response.AppendHeader("Content-encoding", "deflate");
response.Filter = new DeflateStream(response.Filter
, CompressionMode.Compress);
}
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
}
}
}
เท่านี้เราก็สร้าง HTTP-Compression เสร็จเรียบร้อย แต่เมื่อ Run ทดสอบแล้ว จะเกิด Request ดังรูป
สังเกตว่ายังไม่มีการ Compress เกิดขึ้น โดยดูจาก Request ยังมีขนาดเท่าเดิมเพราะว่าเรายังไม่ได้กำหนด CompressFilter ให้กับ Action ที่ต้อการการ Compress ในตัวอย่างนี้จะทดสอบโดยกำหนดที่ Index ใน Controller Home โดยเขียน Code ดังนี้
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using MvcApplication1.Filters;
namespace MvcApplication1.Controllers
{
public class HomeController : Controller
{
[CompressFilter]
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult About()
{
return View();
}
}
}
เมื่อ Run ทดสอบแล้วสังเกตว่าขนาดของ Request จะเล็กลงจาก 1.3 KB เหลือ 853B และมีเวลาในการทำงานน้อยลงจาก 22 ms เหลือ 20 ms
Labels:
ASP.NET MVC
สมัครสมาชิก:
ส่งความคิดเห็น (Atom)
ไม่มีความคิดเห็น:
แสดงความคิดเห็น