Làm cách nào để bật tính năng nén gzip khi sử dụng MVC3 trên IIS7?


100

Có ai biết cách bật nén gzip trong MVC 3 không? Tôi đang sử dụng IIS7.

Kết quả của Kiểm tra Google Chrome:

  1. Bật nén gzip (4)
  2. Nén các tài nguyên sau bằng gzip có thể giảm kích thước truyền của chúng khoảng 2/3 (~ 92,23KB):
  3. / mydomain / có thể tiết kiệm ~ 1.53KB
  4. jquery-1.4.4.min.js có thể tiết kiệm ~ 51.35KB
  5. Cufon.js có thể tiết kiệm ~ 11,89KB
  6. Futura.js có thể tiết kiệm ~ 27,46KB

Không yên tĩnh một bản sao: stackoverflow.com/q/552317/712526
jpaugh

Câu trả lời:


142

Bạn có thể định cấu hình nén thông qua web.configtệp của mình như sau:

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

Bạn có thể tìm tài liệu về phần tử cấu hình này tại iis.net/ConfigReference . Điều này tương đương với:

  1. Mở Dịch vụ Thông tin Internet (Trình quản lý IIS)
  2. Điều hướng qua chế độ xem dạng cây ở bên trái cho đến khi bạn đến thư mục ảo mà bạn muốn sửa đổi
  3. Chọn thư mục ảo thích hợp để tiêu đề của ngăn bên phải trở thành tên của thư mục ảo đã nói.
  4. Chọn "Nén" trong "IIS" trong ngăn bên phải
  5. Đánh dấu vào cả hai tùy chọn và chọn "Áp dụng" trong "Tác vụ" ở ngoài cùng bên phải.

Lưu ý: (Như đã chỉ ra trong phần bình luận) Bạn cần đảm bảo rằng Http Dynamic Compression đã được cài đặt nếu không việc cài đặt doDynamicCompression="true"sẽ không có bất kỳ tác dụng nào. Cách nhanh nhất để làm điều này là:

  1. Bắt đầu> Nhập optionalfeatures(đây là cách nhanh nhất để truy cập cửa sổ "Bật hoặc tắt các tính năng của Windows")
  2. Điều hướng đến Dịch vụ thông tin Internet> Dịch vụ web toàn cầu> Tính năng hiệu suất trong dạng cây "Tính năng của Windows"
  3. Đảm bảo "Nén nội dung động" được chọn
  4. Nhấp vào "Ok" và đợi trong khi Windows cài đặt thành phần

11
Điều đáng chú ý là bạn cần phải cài đặt tùy chọn Http Compression Dynamic IIS để tính năng này hoạt động. Liên kết tham chiếu cấu hình trong câu trả lời này có các chi tiết.
Caleb Vear

16
Trên Windows Server 2008 optionalfeatureskhông hoạt động đối với tôi. Thay vào đó, hãy điều hướng đến Trình quản lý máy chủ> Vai trò> Cuộn đến Máy chủ Web (IIS)> nhấp vào Thêm dịch vụ vai trò. Bây giờ hãy đảm bảo rằng Máy chủ web> Hiệu suất> Nén nội dung tĩnh và Nén nội dung động đã được cài đặt.
Rory

1
Lưu ý rằng điều này có thể làm rối loạn tiêu đề máy chủ lưu trữ "Vary:" của bạn. Thông tin thêm: stackoverflow.com/questions/5372052/…
jjxtra

2
Ít nhất theo kinh nghiệm của tôi, điều này nén mọi thứ NHƯNG đầu ra của Bộ điều khiển MVC. Vì một lý do nào đó, chúng trả về HTML mà không có bất kỳ nén gzip nào.
Chris Moschini

1
Thận trọng !!! IIS Dynamic Compression loại bỏ các tiêu đề Vary, lỗi hoặc tính năng của nó, tôi không biết, nhưng việc triển khai Bộ lọc tùy chỉnh sẽ có ý nghĩa hơn nếu bạn muốn bộ nhớ cache hoạt động chính xác.
Akash Kava

31

Bạn có thể làm điều này trong mã nếu bạn muốn làm điều đó. Tôi sẽ tạo một bộ điều khiển cơ sở mà mọi điều khiển kế thừa từ đó và trang trí nó bằng thuộc tính này bên dưới.

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
@JustA AnotherUserYouMayKnow - phụ thuộc vào cách bạn đang cung cấp tài nguyên của mình; nếu bạn đang trỏ trực tiếp vào các tệp trên máy chủ thì không, tuy nhiên nếu bạn phân phát chúng qua các hành động (vì hệ thống quản lý tài nguyên của chúng tôi cho phép chúng tôi) thì nó hoạt động tuyệt vời. BTW Rick Strahl đã cập nhật điều này để hỗ trợ kiểm tra xem ứng dụng khách có thực sự hỗ trợ gzip trước khi nén hay không
Paul Carroll

4
Lưu ý rằng để chuyển hướng, điều quan trọng là phải bảo vệ khỏi filterbị vô hiệu. Tôi đã sử dụng var response = ...;if( response == null || response.Filter == null)return;.
Travis J

2
Ngoài ra, bạn có thể muốn sử dụng gzipđầu tiên thay vì deflate, đọc thêm ở đây: stackoverflow.com/a/9856879/1026459
Travis J

IIS lưu trữ các tập tin nén, vì vậy nó sẽ không phải nén chúng lại để có hiệu suất tốt hơn. Sử dụng IIS nếu bạn có thể và chỉ sử dụng phương pháp này nếu tính năng nén IIS không khả dụng với bạn.
Muhammad Rehan Saeed

1
Không có giải pháp nào trong số này hoạt động trên MVC5, IIS 8.5, .Net 4.5 Localhost. Tôi nên làm gì, bất kỳ đề xuất?
aadi1295

12

Nén được bật / tắt ở cấp độ của máy chủ. Xem mô-đun nén IIS trong bảng điều khiển quản lý iis.

Dưới đây là hướng dẫn về IIS từ trang microsoft.


1
Bạn có thể đặt nó trong web.config cũng
Jack Marchetti
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.