2013-05-21 5 views
10

मैं एक .NET WebService (सोप, नहीं WCF) पर अपलोड पोस्टेड डेटा के लिए संपीड़न कैसे सक्षम कर सकते हैं? मैंने सोचा कि यह आईआईएस में enabling dynamic compression का एक साधारण मामला होगा लेकिन सक्षम होने के बाद, यह केवल प्रतिक्रिया को संपीड़ित कर रहा है, POST अनुरोध नहीं है।आईआईएस 7 पर एसओएपी वेब सेवा के लिए POST (अपलोड) अनुरोधों के लिए मैं GZIP संपीड़न कैसे सक्षम करूं?

मैं एक सेवा संदर्भ के रूप में यह जोड़ दिया है और मैं उत्पन्न SOAPClient पर किसी भी सेटिंग अनुरोधों के संपीड़न सक्षम करने के लिए नहीं मिल रहा।

यह मैं इसे सर्वर को भेजने से पहले अनुरोध संपीड़ित करने के लिए ग्राहक की ओर एक विन्यास सेटिंग या कोड लापता हो सकती है? या मैं जो करने की कोशिश कर रहा हूं (GZipping POST डेटा) भी समर्थित नहीं है?

आगे की जानकारी: मैं क्लाइंट और सर्वर पर .NET 4.0 उपयोग कर रहा हूँ।

+0

कृपया इस अतः पद का उल्लेख (http://stackoverflow.com/questions/4416177/how-to-compress-http-requests-from-wcf-net-at-the-transport-level) – Rajesh

उत्तर

13

मैं पहले कि 4 साल पर ब्लॉग किया गया है

http://netpl.blogspot.com/2009/07/aspnet-webservices-two-way-response-and.html

मुझे आश्चर्य है कि क्यों आप इस googling द्वारा नहीं मिली है। वैसे भी, यह आपके लिए काम करना चाहिए, हम अब 4 वर्षों से उत्पादन वातावरण में काम कर रहे हैं।

+0

असल में मैं पहले से ही उस कोड का उपयोग कर रहा था लेकिन इसमें कुछ बग्स थीं जिन्हें मैंने ठीक करने के लिए संघर्ष किया था। हालांकि मैंने इस पर अधिक समय बिताया है और अब बग को ठीक कर दिया है। मेरा संस्करण निम्न समस्याओं को हल करता है: सर्वर पर एक अपवाद होने पर सामग्री-एन्कोडिंग gzip शीर्षलेख सेट करें। दूसरा फिक्स: GZIPed अनुरोध नहीं होने पर GZIP अनुरोध स्ट्रीम को डिक्रिप्ट करने का प्रयास न करें। मैंने यहां कोड के अद्यतन संस्करण को पोस्ट किया है: http://pastebin.com/Aak9FUiw – NickG

+0

मूल समाधान के लिए बहुत धन्यवाद। मैं तुम्हें इनाम अवार्ड होगा :) – NickG

+0

तीसरा ठीक "सामग्री-एन्कोडिंग" शीर्षक के दोहरीकरण को दबाने के लिए तो यह हो गया "gzip, gzip" था। सुनिश्चित नहीं है कि यह वास्तव में आवश्यक है लेकिन यह सही नहीं है। – NickG

6

अंत में, मैं विक्टर Zychla के जवाब थे, लेकिन कीड़े की एक जोड़ी (भी अपने लेख की टिप्पणी में उल्लेख किया है) भर में आया था। पूर्णता के लिए, मैं HttpCompression मॉड्यूल यहाँ की मेरी ठीक की गई संस्करण लेकिन कोड (और कार्यान्वयन के दिशा निर्देशों) के बाकी पोस्ट करेंगे आप Wiktor's article में हैं की जरूरत है।

अद्यतन:

मैं वास्तव में के रूप में यह एक बग मैं ठीक नहीं कर सकते (यहां तक ​​कि नीचे मेरी उन्नत संस्करण के साथ) है इस कोड का उपयोग रोकने के लिए किया है। प्रॉक्सी सर्वर के पीछे कई लोगों के लिए यह एक त्रुटि के साथ आता है जो कहता है "gzip हेडर में जादू संख्या गलत है" और मैं यह नहीं समझ सकता कि इसे कैसे ठीक किया जाए। मुझे लगता है कि ऐसा इसलिए है क्योंकि प्रॉक्सी सर्वर जीजेआईपी को डिकंप्रेस करते हैं और यह कोड ज़िप्ड और गैर-ज़िप दोनों प्रतिक्रियाओं को अपने वर्तमान रूप में प्राप्त करने की अनुमति नहीं देता है।

using System; 
using System.IO.Compression; 
using System.Web; 
using System.Web.Security; 

/// <summary> 
/// Implement two way HTTP compression for the SOAP API 
/// Code taken from: http://netpl.blogspot.co.uk/2009/07/aspnet-webservices-two-way- response-and.html 
/// Fix: Set Content-encoding: gzip header when an Exception occurs on the server. 
/// Fix: Do not attempt to decrypt GZIP request stream when request was not GZIPed. 
/// </summary> 
public class HttpCompressionModule : IHttpModule 
{ 
    private bool isDisposed = false; 

    ~HttpCompressionModule() 
    { 
      Dispose(false); 
    } 

    public void Init(HttpApplication context) 
    { 
      context.BeginRequest += new EventHandler(Context_BeginRequest); 
      context.PreSendRequestHeaders += new EventHandler(context_PreSendRequestHeaders); 
    } 

    void context_PreSendRequestHeaders(object sender, EventArgs e) 
    { 
      // Fix headers having been lost if an exception occurred. 
      HttpApplication app = sender as HttpApplication; 
      HttpContext ctx = app.Context; 
      if (app.Response.Filter is GZipStream) SetEncoding("gzip"); 
      else if (app.Response.Filter is DeflateStream) SetEncoding("deflate"); 

      // Fix double header 
      if (ctx.Response.Headers["Content-encoding"] == "gzip,gzip") 
        ctx.Response.Headers.Set("Content-encoding", "gzip"); 
    } 

    public void Context_BeginRequest(object sender, EventArgs e) 
    { 
      HttpApplication app = sender as HttpApplication; 
      HttpContext ctx = app.Context; 

      // Currently only enable for the Uploader API webservice 
      if (!ctx.Request.Url.PathAndQuery.ToLower().Contains("uploaderapi.asmx")) 
      { 
        return; 
      } 

      // Add request filter if request was GZIP encoded 
      string requestEncoding = ctx.Request.Headers["Content-encoding"]; 
      if (requestEncoding != null && requestEncoding == "gzip") 
      { 
       app.Request.Filter = 
        new System.IO.Compression.GZipStream(app.Request.Filter, CompressionMode.Decompress); 
      } 

      // Add response compression filter if the client accepts compressed responses 
      if (IsEncodingAccepted("gzip")) 
      { 
        app.Response.Filter = new GZipStream(app.Response.Filter, CompressionMode.Compress); 
        SetEncoding("gzip"); 
      } 
      else if (IsEncodingAccepted("deflate")) 
      { 
        app.Response.Filter = new DeflateStream(app.Response.Filter, CompressionMode.Compress); 
        SetEncoding("deflate"); 
      } 
    } 

    private bool IsEncodingAccepted(string encoding) 
    { 
      return HttpContext.Current.Request.Headers["Accept-encoding"] != null && 
        HttpContext.Current.Request.Headers["Accept-encoding"].Contains(encoding); 
    } 

    private void SetEncoding(string encoding) 
    { 
      HttpContext ctx = HttpContext.Current; 
      string responseEncodings = ctx.Response.Headers.Get("Content-encoding"); 
      if (responseEncodings == null || !responseEncodings.Contains(encoding)) 
        HttpContext.Current.Response.AppendHeader("Content-encoding", encoding); 
    } 

    public void Dispose() 
    { 
      Dispose(true); 
    } 

    private void Dispose(bool dispose) 
    { 
      isDisposed = dispose; 
    } 
} 
+2

निक, यह याद रखें कि यह एक पूर्ण उत्तर नहीं है। दोनों HttpResponseDecompressed और HttpRequestCompressed भी आवश्यक हैं। –

+0

@WiktorZychla धन्यवाद - मैंने यह जवाब देने के लिए अपना उत्तर अपडेट कर दिया है कि आपके आलेख में सभी कोड/निर्देश हैं। मेरा उत्तर केवल उन बग/संगतता समस्याओं को ठीक करने के लिए है (और यदि आप उन्हें अपने आप में शामिल करने का निर्णय लेते हैं तो अनावश्यक होगा लेख) – NickG

+0

निक, आपकी स्पष्ट व्याख्या के कारण, मैं प्रवेश में कोई संशोधन नहीं करने जा रहा हूं। मुझे लगता है कि इसका उपयोग करने का प्रयास करने वाले किसी भी व्यक्ति को आपकी टिप्पणियां मिलेंगी और आपके अपडेट किए गए दृष्टिकोण का पालन करेंगी चैप्टर। समाधान को खुशी हुई और आपके सुधारों के लिए धन्यवाद। –

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