How do I enable GZIP compression for POST (upload) requests to a SOAP WebService on IIS 7?

前端 未结 2 1870
自闭症患者
自闭症患者 2020-12-09 12:23

How can I enable compression for POSTed data uploaded to a .NET WebService (SOAP, not WCF)? I thought it would be a simple matter of enabling dynamic compression in IIS but

相关标签:
2条回答
  • 2020-12-09 12:51

    I've blogged on that 4 years ago

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

    I wonder why you haven't found this by googling. Anyway, this should work for you, we have it working in a production environment for 4 years now.

    0 讨论(0)
  • 2020-12-09 12:53

    In the end, I used Wiktor Zychla's answer but came across a couple of bugs (also mentioned in the comments of his article). For completeness, I'll post my fixed version of the HttpCompression module here but the rest of the code (and implementation guidelines) you need are in Wiktor's article.

    UPDATE:

    I've actually had to stop using this code as it has a bug I can't fix (even with my improved version below). For many people behind proxy servers it comes up with an error which says "the magic number in the gzip header is incorrect" and I can't figure out how to fix this. I think it's because proxy servers decompress GZIP and this code doesn't allow for receiving both zipped and non-zipped responses in its current form.

    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;
        }
    }
    
    0 讨论(0)
提交回复
热议问题