ฉันจะเปิดใช้งานการบีบอัด 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.