:: Kunagorn Sirikup :: C# Developer

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



ไม่มีความคิดเห็น:

แสดงความคิดเห็น