WebService 数据压缩

很长时间没有更新博客了
一直在忙这做项目,累啊,苦啊
现在刚好忙完了,赶紧看看兄弟姐妹们的博客,其中看了刚刚兄有关Web服务初探:用Demo学Web服务系列,使自己才更清楚的了解了WebService,Thx!
然而项目中有时数据大,所以在网上搜了个压缩数据的,特此贴出来,方便自己日后用到,也希望能给大家一些帮助,呵呵
CompressionExtension.cs:
using System;
using System.IO;
using System.Text ;
using System.Web.Services;
using System.Web.Services.Protocols ;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using System.Xml ;

namespace BLL
{
    
/// <summary>
    
/// Summary description for ConpressionExtension.
    
/// </summary>

    public class CompressionExtension : System.Web.Services.Protocols.SoapExtension
    
{
        Stream oldStream;
        Stream newStream;
    

        
public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute) 
        
{
            
return attribute;
        }


        
// Get the Type
        public override object GetInitializer(Type t) 
        
{
            
return typeof(CompressionExtension);
        }

    
        
// Get the CompressionExtensionAttribute
        public override void Initialize(object initializer) 
        
{
            CompressionExtensionAttribute attribute 
= (CompressionExtensionAttribute) initializer;

            
return;
        }


        
// Process the SOAP Message
        public override void ProcessMessage(SoapMessage message) 
        
{
            
// Check for the various SOAP Message Stages 
            switch (message.Stage) 
            
{

                
case SoapMessageStage.BeforeSerialize:
                    
break;

                
case SoapMessageStage.AfterSerialize:
                    
// ZIP the contents of the SOAP Body after it has
                    
// been serialized
                    Zip();
                    
break;

                
case SoapMessageStage.BeforeDeserialize:
                    
// Unzip the contents of the SOAP Body before it is
                    
// deserialized
                    Unzip();
                    
break;

                
case SoapMessageStage.AfterDeserialize:
                    
break;

                
default:
                    
throw new Exception("invalid stage");
            }

        }


        
// Gives us the ability to get hold of the RAW SOAP message
        public override Stream ChainStream( Stream stream ) 
        
{
            oldStream 
= stream;
            newStream 
= new MemoryStream();
            
return newStream;
        }


        
// Utility method to copy streams
        void Copy(Stream from, Stream to) 
        
{
            TextReader reader 
= new StreamReader(from);
            TextWriter writer 
= new StreamWriter(to);
            writer.WriteLine(reader.ReadToEnd());
            writer.Flush();
        }


    
        
// Zip the SOAP Body
        private void Zip() 
        
{
            newStream.Position 
= 0;
            
// Zip the SOAP Body
            newStream = ZipSoap(newStream);
            
// Copy the streams
            Copy(newStream, oldStream);
        }


        
// The actual ZIP method
        private byte[] Zip(string stringToZip) 
        
{
            
byte[] inputByteArray = Encoding.UTF8.GetBytes(stringToZip);
            MemoryStream ms 
= new MemoryStream();

            
// Check the #ziplib docs for more information
            ZipOutputStream zipOut = new ZipOutputStream( ms ) ;
            ZipEntry ZipEntry 
= new ZipEntry("ZippedFile");
            zipOut.PutNextEntry(ZipEntry);
            zipOut.SetLevel(
9);
            zipOut.Write(inputByteArray, 
0 , inputByteArray.Length ) ;     
            zipOut.Finish();
            zipOut.Close();

            
// Return the zipped contents
            return ms.ToArray();
        }


        
// Select and Zip the appropriate parts of the SOAP message
        public MemoryStream ZipSoap(Stream streamToZip) 
        
{
            streamToZip.Position 
= 0;
            
// Load a XML Reader
            XmlTextReader reader = new XmlTextReader(streamToZip);
            XmlDocument dom 
= new XmlDocument();
            dom.Load(reader);
            
// Load a NamespaceManager to enable XPath selection
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(dom.NameTable);
            nsmgr.AddNamespace(
"soap""http://schemas.xmlsoap.org/soap/envelope/");
            XmlNode node 
= dom.SelectSingleNode("//soap:Body", nsmgr);
            
// Select the contents within the method defined in the SOAP body
            node = node.FirstChild.FirstChild;
            
// Check if there are any nodes selected
            while( node != null )
            
{
                
if( node.InnerXml.Length > 0 )
                
{
                    
// Zip the data
                    byte[] outData = Zip(node.InnerXml);
                    
// Convert it to Base64 for transfer over the internet
                    node.InnerXml = Convert.ToBase64String(outData) ;
                }

                
// Move to the next parameter
                node = node.NextSibling ;
            }

            MemoryStream ms 
= new MemoryStream();
            
// Save the updated data
            dom.Save(ms);
            ms.Position 
= 0;
      
            
return ms;
        }


        
// Unzip the SOAP Body
        private void Unzip() 
        
{
            MemoryStream unzipedStream 
= new MemoryStream();
        
            TextReader reader 
= new StreamReader(oldStream);
            TextWriter writer 
= new StreamWriter(unzipedStream);
            writer.WriteLine(reader.ReadToEnd());
            writer.Flush();
            
// Unzip the SOAP Body
            unzipedStream = UnzipSoap(unzipedStream);
            
// Copy the streams
            Copy(unzipedStream, newStream);
     
            newStream.Position 
= 0;
        }


        
// Actual Unzip logic
        private byte[] Unzip(string stringToUnzip) 
        
{
            
// Decode the Base64 encoding
            byte[] inputByteArray = Convert.FromBase64String( stringToUnzip ) ;
            MemoryStream ms 
= new MemoryStream(inputByteArray) ;
            MemoryStream ret 
= new MemoryStream();

            
// Refer to #ziplib documentation for more info on this
            ZipInputStream zipIn = new ZipInputStream(ms);
            ZipEntry theEntry 
= zipIn.GetNextEntry();
            Byte[] buffer 
= new Byte[2048] ;
            
int size = 2048;
            
while (true
            
{
                size 
= zipIn.Read(buffer, 0, buffer.Length);
                
if (size > 0
                
{
                    ret.Write(buffer, 
0, size);
                }
 
                
else 
                
{
                    
break;
                }

            }

            
return ret.ToArray();
        }


        
// Unzip the SOAP Body
        public MemoryStream UnzipSoap(Stream streamToUnzip) 
        
{
            streamToUnzip.Position 
= 0;
            
// Load a XmlReader
            XmlTextReader reader = new XmlTextReader(streamToUnzip);
            XmlDocument dom 
= new XmlDocument();
            dom.Load(reader);

            XmlNamespaceManager nsmgr 
= new XmlNamespaceManager(dom.NameTable);
            nsmgr.AddNamespace(
"soap""http://schemas.xmlsoap.org/soap/envelope/");
            
// Select the SOAP Body node 
            XmlNode node = dom.SelectSingleNode("//soap:Body", nsmgr);
            node 
= node.FirstChild.FirstChild;

            
// Check if node exists
            while( node != null )
            
{
                
if( node.InnerXml.Length >0 )
                
{
                    
// Send the node's contents to be unziped
                    byte[] outData = Unzip(node.InnerXml);
                    
string sTmp = Encoding.UTF8.GetString(outData);
                    node.InnerXml 
= sTmp;
                }

                
// Move to the next parameter 
                node = node.NextSibling ;
            }


            MemoryStream ms 
= new MemoryStream();
      
            dom.Save(ms);
            ms.Position 
= 0;

            
return ms;
        }


    }

}

CompressionExtensionAttribute.cs:
using System;
using System.Web.Services;
using System.Web.Services.Protocols;

namespace BLL
{

    
/// <summary>
    
/// Summary description for CompressionExtensionAttribute.
    
/// </summary>

    
    
// Make the Attribute only Applicable to Methods
    [AttributeUsage(AttributeTargets.Method)]
    
public class CompressionExtensionAttribute : System.Web.Services.Protocols.SoapExtensionAttribute
    
{
    
        
private int priority;

        
// Override the base class properties
        public override Type ExtensionType 
        
{
            
get return typeof(CompressionExtension); }
        }


        
public override int Priority 
        
{
            
get 
            

                
return priority; 
            }

            
set 
            

                priority 
= value; 
            }

        }


    }

}

在server | Client 都需要
调用很简单,只要在代理类中web方法加个:
[CompressionExtension]

原文地址:http://www.123aspx.com/redir.aspx?res=29459
posted @ 2007-04-10 15:18  Bryant  阅读(2109)  评论(3编辑  收藏  举报