2013-06-26 27 views
18

Tôi đã sử dụng bộ lọc nén cho hành động MVC của tôi như là chi tiết tại đây:nén lọc cho Web API

http://msdn.microsoft.com/en-us/magazine/gg232768.aspx

Tôi đã cố gắng để tái khẳng định các mã để làm điều gì đó tương tự cho Web API , nhưng tôi đã đạt được rào cản:

public class CompressAPIAttribute : System.Web.Http.Filters.ActionFilterAttribute 
{ 
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext filterContext) 
    { 
     var preferredEncoding = GetPreferredEncoding(filterContext.Request); 
     Stream compressedStream = null; 
     // Compress the response accordingly 
     var response = filterContext.Response; 
     response.Headers.Add("Content-encoding", preferredEncoding.ToString()); 

     if (preferredEncoding == CompressionScheme.Gzip) 
     { 
      response.Content = new GZipStream(compressedStream, CompressionMode.Compress); //THIS WON'T WORK 
     } 

     if (preferredEncoding == CompressionScheme.Deflate) 
     { 
      response.Content = new DeflateStream(compressedStream, CompressionMode.Compress); //THIS WON'T WORK 
     } 
     return; 
    } 

    enum CompressionScheme 
    { 
     Gzip = 0, 
     Deflate = 1, 
     Identity = 2 
    } 

    private CompressionScheme GetPreferredEncoding(HttpRequestMessage request) 
    { 
     var acceptableEncoding = request.Headers.AcceptEncoding; 

     if (acceptableEncoding.Where(h => h.Value.Contains("gzip")).Count() > 0) 
      return CompressionScheme.Gzip; 

     if (acceptableEncoding.Where(h => h.Value.Contains("deflate")).Count() > 0) 
      return CompressionScheme.Deflate; 

     return CompressionScheme.Identity; 
    } 

Bất kỳ ý tưởng nào tôi có thể gán luồng nén cho nội dung phản hồi?

Tôi nên chỉ ra điều này đang được lưu trữ trong IIS 6.0, mà tôi không kiểm soát.

+2

Trong ASP.NET Web API tiếp cận tốt hơn nhiều là 'DelegatingHandler' và đã có câu trả lời mô tả giải pháp http://stackoverflow.com/questions/10443588/mvc4-webapi-compress-get-method-response – tpeczek

+0

Bộ lọc cho phép bạn chỉ định một số hành động webapi nhất định ... không phải là DelegatingHandler buộc bạn phải nén tất cả các hành động? –

Trả lời

40

Tôi nghĩ bạn nên không làm điều này trong bộ lọc hành động vì giai đoạn mô hình xảy ra trước khi bộ lọc hành động được thực hiện và trong quá trình mô hình hóa các trình định dạng có thể đọc luồng để deserialize nó, trong trường hợp nó sẽ thất bại.

Nếu bạn đang sử dụng IIS, sau đó làm như sau để nén setup (Sau đây có một số đoạn từ Scott Hanselman blog post):

  • Enabled "Dynamic Compression" tính năng trong IIS.

  • Quay lại quản lý IIS, đi tới trang cho SERVER, không phải là TRANG WEB. Click vào Configuration Editor: enter image description here

  • Từ menu thả xuống, chọn system.webServer/httpCompression: enter image description here

  • Sau đó click vào các loại động và bây giờ rằng bạn đang trong trình soạn thảo danh sách, suy nghĩ về những gì loại bạn muốn nén. Theo mặc định, / là sai, nhưng bạn chỉ có thể bật tính năng này. Tôi đã chọn một chút cầu kỳ và thêm ứng dụng/atom + xml, application/json và application/atom + xml; charset = utf-8 như bên dưới. Đó là một chút xíu mà ứng dụng/atom + xml và application/atom + xml; charset = utf-8 là các mục riêng biệt. Vui lòng thêm những gì bạn từng thích ở đây. enter image description here
  • Sau khi bạn đã thêm họ và đóng hộp thoại, hãy chắc chắn nhấp Áp dụngRestart Dịch vụ IIS của bạn sẽ nạp module mới.
  • Bây giờ, hãy yêu cầu sử dụng tiêu đề Accept-Encoding và bạn sẽ thấy phản hồi như mong đợi.

  • EDIT (ngoài trên bao gồm "application/json; charset = utf-8" để trang trải tất cả các định dạng json)

+1

Thứ tốt! Thật không may, tôi đang trên IIS 6.0, không có quyền kiểm soát máy chủ. –

+1

Lưu ý: nếu bạn không có Trình chỉnh sửa cấu hình (như tôi trong IIS 7), chỉ cần cài đặt Gói quản trị từ WebInstaller – Kugel

+0

Trong trường hợp "Accept-Encoding: deflate" không hoạt động đối với tôi. – Artiom

Các vấn đề liên quan