ฉันจะเปิดใช้งานการบีบอัด gzip เมื่อใช้ MVC3 บน IIS7 ได้อย่างไร


101

ไม่มีใครรู้วิธีเปิดใช้งานการบีบอัด gzip ใน MVC 3? ฉันใช้ IIS7

ผลการตรวจสอบ Google Chrome:

  1. เปิดใช้งานการบีบอัด gzip (4)
  2. การบีบอัดทรัพยากรต่อไปนี้ด้วย gzip สามารถลดขนาดการถ่ายโอนได้ประมาณสองในสาม (~ 92.23KB):
  3. / mydomain / สามารถบันทึกได้ ~ 1.53 KB
  4. jquery-1.4.4.min.js สามารถบันทึก ~ 51.35KB
  5. Cufon.js สามารถประหยัดได้ ~ 11.89KB
  6. Futura.js สามารถประหยัดได้ ~ 27.46KB

ไม่เงียบซ้ำ: stackoverflow.com/q/552317/712526
— jpaugh

คำตอบ:


143

คุณสามารถกำหนดค่าการบีบอัดผ่านweb.configไฟล์ของคุณได้ดังนี้:

<system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
</system.webServer>

คุณสามารถค้นหาเอกสารขององค์ประกอบการกำหนดค่านี้ที่iis.net/ConfigReference สิ่งนี้เทียบเท่ากับ:

  1. การเปิดบริการข้อมูลทางอินเทอร์เน็ต (ตัวจัดการ IIS)
  2. การนำทางผ่านมุมมองแบบต้นไม้ทางด้านซ้ายจนกว่าคุณจะไปถึงไดเร็กทอรีเสมือนที่คุณต้องการแก้ไข
  3. การเลือกไดเร็กทอรีเสมือนที่เหมาะสมเพื่อให้หัวเรื่องของบานหน้าต่างด้านขวากลายเป็นชื่อของไดเร็กทอรีเสมือนดังกล่าว
  4. เลือก "การบีบอัด" ภายใต้ "IIS" ในบานหน้าต่างด้านขวา
  5. เลือกทั้งสองตัวเลือกและเลือก "ใช้" ใต้ "การดำเนินการ" ทางด้านขวาสุด

หมายเหตุ: (ตามที่ระบุไว้ในความคิดเห็น)คุณต้องตรวจสอบให้แน่ใจว่าได้ติดตั้ง Http Dynamic Compression ไว้แล้วมิฉะนั้นการตั้งค่าdoDynamicCompression="true"จะไม่มีผลใด ๆ วิธีที่เร็วที่สุดในการดำเนินการนี้คือ:

  1. เริ่ม> พิมพ์optionalfeatures(นี่เป็นวิธีที่เร็วที่สุดในการไปที่หน้าต่าง "เปิดหรือปิดคุณลักษณะของ Windows")
  2. ไปที่ Internet Information Services> World Wide Web Services> Performance Features ใน Treeview "คุณลักษณะของ Windows"
  3. ตรวจสอบว่าได้เลือก "การบีบอัดเนื้อหาแบบไดนามิก"
  4. คลิก "ตกลง" และรอในขณะที่ Windows ติดตั้งคอมโพเนนต์

11
เป็นที่น่าสังเกตว่าคุณต้องติดตั้งตัวเลือก Http Compression Dynamic IIS เพื่อให้ใช้งานได้ ลิงก์อ้างอิง config ในคำตอบนี้มีรายละเอียด
— Caleb Vear

16
บน Windows Server 2008 optionalfeaturesไม่ได้ผลสำหรับฉัน ให้ไปที่ Server Manager> Roles> Scroll to Web Server (IIS)> คลิก Add Role Services ตอนนี้ตรวจสอบให้แน่ใจว่าได้ติดตั้ง Web Server> Performance> Static Content Compression และ Dynamic Content Compression แล้ว
— รอรี

1
โปรดทราบว่าอาจทำให้ส่วนหัวโฮสต์ "Vary:" ของคุณเลอะได้ ข้อมูลเพิ่มเติม: stackoverflow.com/questions/5372052/…
— jjxtra

2
อย่างน้อยจากประสบการณ์ของฉันสิ่งนี้บีบอัดทุกอย่าง แต่เอาต์พุตของ MVC Controllers ด้วยเหตุผลบางประการที่ส่งคืน HTML โดยไม่มีการบีบอัด gzip
— Chris Moschini

1
ข้อควรระวัง !!! การบีบอัดแบบไดนามิกของ IIS จะตัดส่วนหัวที่แตกต่างกันออกไปซึ่งเป็นจุดบกพร่องหรือคุณสมบัติฉันไม่รู้ แต่การใช้ตัวกรองแบบกำหนดเองจะเหมาะสมกว่าหากคุณต้องการให้แคชทำงานอย่างถูกต้อง
— Akash Kava

31

คุณสามารถทำได้ในโค้ดถ้าคุณต้องการทำเช่นนั้น ฉันจะสร้างตัวควบคุมพื้นฐานที่ทุกตัวควบคุมสืบทอดมาและตกแต่งด้วยแอตทริบิวต์ด้านล่างนี้

public class CompressAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

        var encodingsAccepted = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
        if (string.IsNullOrEmpty(encodingsAccepted)) return;

        encodingsAccepted = encodingsAccepted.ToLowerInvariant();
        var response = filterContext.HttpContext.Response;

        if (encodingsAccepted.Contains("deflate"))
        {
            response.AppendHeader("Content-encoding", "deflate");
            response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
        }
        else if (encodingsAccepted.Contains("gzip"))
        {
            response.AppendHeader("Content-encoding", "gzip");
            response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
        }
    }
}

2
@JustAnotherUserYouMayKnow - ขึ้นอยู่กับว่าคุณให้บริการทรัพยากรของคุณอย่างไร หากคุณชี้ไปที่ไฟล์บนเซิร์ฟเวอร์โดยตรงก็ไม่อย่างไรก็ตามหากคุณให้บริการผ่านการกระทำ (เนื่องจากระบบการจัดการทรัพยากรของเราอนุญาตให้เรา) มันจะทำงานได้อย่างยอดเยี่ยม BTW Rick Strahl ได้อัปเดตสิ่งนี้เพื่อรองรับการตรวจสอบว่าไคลเอนต์รองรับ gzip
— Paul Carroll

4
โปรดทราบว่าสำหรับการเปลี่ยนเส้นทางสิ่งสำคัญคือต้องป้องกันการfilterเป็นโมฆะ ฉันใช้var response = ...;if( response == null || response.Filter == null)return;.
— Travis J

2
นอกจากนี้คุณอาจต้องการที่จะใช้gzipครั้งแรกแทนการdeflateอ่านเพิ่มเติมได้ที่นี่: stackoverflow.com/a/9856879/1026459
— เทรวิส J

IIS จะแคชไฟล์ที่บีบอัดดังนั้นจึงไม่ต้องบีบอัดไฟล์อีกครั้งเพื่อประสิทธิภาพที่ดีขึ้น ใช้ IIS ถ้าคุณทำได้และใช้แนวทางนี้เฉพาะในกรณีที่คุณไม่มีการบีบอัด IIS
— Muhammad Rehan Saeed

1
ไม่มีโซลูชันใดที่ทำงานบน MVC5, IIS 8.5, .Net 4.5 Localhost ฉันควรทำอย่างไรข้อเสนอแนะใด ๆ
— aadi1295

12

เปิด / ปิดการบีบอัดที่ระดับของเซิร์ฟเวอร์ ดูโมดูลการบีบอัด IIS ในคอนโซลการจัดการ iis

ต่อไปนี้เป็นคำแนะนำสำหรับ IISจากเว็บไซต์ของไมโครซอฟท์


1
คุณสามารถตั้งค่าใน web.config ได้เช่นกัน
— Jack Marchetti
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.