2013-06-26 9 views
18

मैं के रूप में यहाँ विस्तृत मेरी MVC कार्यों के लिए संपीड़न फिल्टर का उपयोग कर रहा हूँ:संपीड़न फिल्टर

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

मैं फिर से इस प्रयोजन के लिए वेब एपीआई के लिए इसी तरह कुछ करने के लिए कोड की कोशिश की है , लेकिन मैंने एक रोडब्लॉक मारा है:

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; 
    } 

कोई विचार मैं प्रतिक्रिया की सामग्री में संपीड़ित स्ट्रीम कैसे निर्दिष्ट कर सकता हूं?

मुझे यह इंगित करना चाहिए कि यह आईआईएस 6.0 में होस्ट किया जा रहा है, जिसे मैं नियंत्रित नहीं करता हूं।

+2

ASP.NET वेब एपीआई काफी बेहतर दृष्टिकोण में 'DelegatingHandler' है और समाधान का वर्णन करने वाला एक उत्तर पहले से ही है http://stackoverflow.com/questions/10443588/mvc4-webapi-compress-get-method-response – tpeczek

+0

एक फ़िल्टर आपको केवल कुछ वेबपी क्रियाओं को निर्दिष्ट करने की अनुमति देता है ... कोई नहीं प्रतिनिधिमंडल आपको सभी कार्यों को संपीड़ित करने के लिए मजबूर करता है? –

उत्तर

40

मुझे लगता है कि आप नहीं एक कार्रवाई फिल्टर में करना चाहिए के रूप में modelbinding चरण से पहले कार्रवाई फिल्टर क्रियान्वित कर रहे हैं होता है और modelbinding formatters यह deserialize करने के लिए धारा पढ़ने जा सकता है, जिस स्थिति में यह विफल हो जाएगा दौरान।

आप आईआईएस का उपयोग कर रहे हैं, तो सेटअप संपीड़न के लिए निम्न (निम्नलिखित है स्कॉट Hanselman blog post से कुछ के टुकड़े) कार्य करें:

  • सक्षम IIS में "गतिशील संपीड़न" सुविधा।

  • आईआईएस प्रबंधक में वापस, सर्वर के लिए पृष्ठ पर जाएं, साइट पर नहीं। विन्यास संपादक पर क्लिक करें: ड्रॉपडाउन से enter image description here

  • , चयन system.webServer/httpCompression: enter image description here

  • तब गतिशील प्रकार पर क्लिक करें और अब है कि आप सूची संपादक में कर रहे हैं, क्या प्रकार के बारे में लगता है कि आप संकुचित करना चाहते हैं। डिफ़ॉल्ट रूप से / गलत है, लेकिन आप इसे चालू कर सकते हैं। मैंने थोड़ा और अधिक पसंद किया और जोड़ा गया एप्लिकेशन/एटम + एक्सएमएल, एप्लिकेशन/जेसन, और एप्लिकेशन/एटम + एक्सएमएल; वर्णसेट = यूटीएफ -8 जैसा नीचे देखा गया है। यह थोड़ा गॉचा है कि एप्लिकेशन/परमाणु + एक्सएमएल और एप्लिकेशन/परमाणु + एक्सएमएल; charset = utf-8 अलग प्रविष्टियां हैं। जो भी आप कभी पसंद करते हैं उसे जोड़ने के लिए स्वतंत्र महसूस करें। enter image description here
  • के बाद आपने उन्हें शामिल और संवाद बंद कर दिया है, क्लिक करने के लिए लागू और पुनः प्रारंभ अपने आईआईएस सेवा नया मॉड्यूल लोड करने के लिए सुनिश्चित करें।
  • अब Accept-Encoding शीर्षलेख का उपयोग कर अनुरोध करें और आपको अपेक्षित प्रतिक्रिया दिखाई देनी चाहिए।

  • संपादित (ऊपर के अलावा शामिल हैं "application/json; charset = utf-8" दोनों json स्वरूपों को कवर करने)

+1

अच्छी चीजें! दुर्भाग्यवश, मैं सर्वर पर कोई नियंत्रण नहीं के साथ आईआईएस 6.0 पर हूं। –

+1

नोट: यदि आपके पास कॉन्फ़िगरेशन संपादक नहीं है (जैसे कि आईआईएस 7 में) तो वेबइंस्टॉलर – Kugel

+0

से व्यवस्थापन पैक इंस्टॉल करें "Accept-Encoding: deflate" के मामले में मेरे लिए काम नहीं करते हैं। – Artiom

संबंधित मुद्दे