avatar
Today is Friday
October 18, 2019

Search Results Archives: March 2008

March 15, 2008

Developer Days 2008

by tsnoei — Categories: Uncategorized — No Comments - Afdrukken Afdrukken

Dit jaar zullen de Developer Days plaatsvinden op 22 en 23 mei in de RAI in Amsterdam. Meer hierover is te vinden op de website van Microsoft. Ook dit jaar wordt het evenement weer gecombineerd met het MIX event.

March 14, 2008

IIS v6 (Windows 2003) en gecomprimeerde communicatie – Deel II

by tsnoei — Categories: Uncategorized — No Comments - Afdrukken Afdrukken

compression.JPGIn deel I was te lezen hoe je IIS 6 kunt configureren zodat er gecomprimeerd communicatie plaatsvindt. Vooral bij webservice implementaties kan dit leiden tot een reductie van de traffic van 90%. Bij beschikbaarheid van slechts een beperkte bandbreedte is het dus zeker handig na te gaan of gecomprimeerde communicatie een optie is. In deel II (en tevens het laatste deel) probeer ik te beschrijven hoe je gebruik kunt maken met een .NET webservice client van een webserver die gecomprimeerde communicatie toestaat. Standaard ondersteund .NET dit niet. Er zal dus wat moeten worden gedaan om te zorgen dat de client gecomprimeerde communicatie gaat gebruiken.

Om te beginnen is het library SharpZibLib noodzakelijk. Dit library gaat zorgdragen voor de decompressie van de te ontvangen data van een bepaalde webservice. De webservice client moet aan de server aangeven dat hij overweg kan met gecomprimeerde data. Daarom moet er in de http-header van de SOAP-request de key “Accept-Encoding” worden meegegeven met als waarden de type encodings die kunnen worden geaccepteerd, in dit geval gzip en deflate. Om te zorgen dat dit makkelijk te implementeren is in verschillende clients is het niet handig deze code op te nemen in de webservice proxyclass. De hieronder beschreven oplossing houdt daar rekening mee.

Onderstaande class verzorgt de decompressie van data:

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Net;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
using ICSharpCode.SharpZipLib.GZip;

namespace snoei.net.utils
{
    public class HttpWebResponseDecompressed : WebResponse
    {
        public static string _LastCompressionMethod = "-";

        public static string LastCompressionMethod
        {
            get { return _LastCompressionMethod; }
            set { _LastCompressionMethod = value; }
        }

        private HttpWebResponse mResponse;
        internal HttpWebResponseDecompressed(WebResponse response)
        {
            mResponse = (HttpWebResponse)response;
        }

        public override long ContentLength
        {
            get { return mResponse.ContentLength; }
            set { mResponse.ContentLength = value; }
        }

        public override string ContentType
        {
            get { return mResponse.ContentType; }
            set { mResponse.ContentType = value; }
        }

        public override Uri ResponseUri
        {
            get { return mResponse.ResponseUri; }
        }

        public override WebHeaderCollection Headers
        {
            get { return mResponse.Headers; }
        }

        public override Stream GetResponseStream()
        {
            Stream compressedStream = null;

            // select decompression method
            if (mResponse.ContentEncoding == "gzip")
            {
                LastCompressionMethod = "gzip";
                compressedStream = new GZipInputStream(mResponse.GetResponseStream());
            }
            else if (mResponse.ContentEncoding == "deflate")
            {
                LastCompressionMethod = "deflate";
                compressedStream = new InflaterInputStream(mResponse.GetResponseStream());
            }

            if (compressedStream != null)
            {
                // decompress
                MemoryStream decompressedStream = new MemoryStream();
                int size = 2048;
                byte[] writeData = new byte[2048];
                while (true)
                {
                    size = compressedStream.Read(writeData, 0, size);
                    if (size > 0)
                    {
                        decompressedStream.Write(writeData, 0, size);
                    }
                    else
                    {
                        break;
                    }
                }
                decompressedStream.Seek(0, SeekOrigin.Begin);
                return decompressedStream;
            }
            else
            {
                LastCompressionMethod = "-";
                return mResponse.GetResponseStream();
            }
        }
    }
}

Deze class is een overerfde van de WebResponse class. Deze class kunnen we vervolgens gebruiken in elke overerfde van een webservice client proxy class zoals hieronder beschreven. De overerfde van de proxy class maken we simpelweg aan op de volgende manier:

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;

namespace snoei.net.webservices
{
    public class MyWebServiceWithUsingCompression : snoei.net.webservices.MyWebService
    {
        protected override System.Net.WebRequest GetWebRequest(Uri uri)
        {
            WebRequest request = base.GetWebRequest(uri);
            request.Headers.Add("Accept-Encoding", "gzip, deflate");
            return request;
        }

        protected override WebResponse GetWebResponse(WebRequest request)
        {
            try
            {
                return new info18xy.vsearchwingui.HttpWebResponseDecompressed(request.GetResponse());
            }
            catch (Exception e)
            {
                throw e;
            }
        }
    }
}

snoei.net.webservices.MyWebService is een door .NET gegenereerde proxy class. In bovenstaande overerfde wordt gezorgt dat automatisch bij het aanroepen van de webmethods in proxy class, in de soapheader wordt meegegeven dat de client overweg kan met compressie. Bij de ontvangst van de data wordt gecomprimeerde dan automatisch gedecomprimeerd. Als er geen compressie is ondersteund door de webserver dan functioneert de code ook gewoon correct.

Compressie kan bijzonder handig zijn in situaties met beperkte bandbreedte en overwegend communicatie van data. Kijk eens in de log files van IIS daar zijn de verschillen tussen communicatie zonder en met compressie goed te zien.

© 2019 Snoei's .NET blog All rights reserved - Wallow theme v0.44 by ([][]) TwoBeers - Powered by WordPress - Have fun!