⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 soapsizeextension.cs

📁 Microsoft Mobile Development Handbook的代码,有C#,VB,C++的
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Web.Services.Protocols;
using System.Text.RegularExpressions;

namespace CompressionSOAPExtensionLibrary
{
    /// <summary>
    /// Define a class for the CompressionsSoapExtension attribute
    /// </summary>
    [AttributeUsage(AttributeTargets.Method)]
    public class SoapSizeExtensionAttribute : SoapExtensionAttribute
    {
        private int priority;

        /// <summary>
        /// Returns the type of the object that actually performs the logic associated
        /// with this SOAP extension
        /// </summary>
        public override Type ExtensionType
        {
            get { return typeof(SoapSizeExtension); }
        }

        /// <summary>
        /// The Priority property indicates the order of processing when there are 
        /// several SOAP extensions applied simultaneously
        /// </summary>
        public override int Priority
        {
            get
            {
                return priority;
            }
            set
            {
                priority = value;
            }
        }
    }

    public class SoapSizeExtension : SoapExtension
    {
        Stream oldStream;
        Stream newStream;
        private string soapInput = null;

        public override Stream ChainStream(Stream stream)
        {
            oldStream = stream;
            newStream = new MemoryStream();
            return newStream;
        }

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

        public override object GetInitializer(Type serviceType)
        {
            return typeof(SoapSizeExtension);
        }

        public override void Initialize(object initializer)
        {
            SoapSizeExtensionAttribute attribute =
                (SoapSizeExtensionAttribute)initializer;
        }

        public override void ProcessMessage(SoapMessage message)
        {
            switch (message.Stage)
            {
                case SoapMessageStage.BeforeDeserialize:
                    BeforeDeserialize();
                    break;

                case SoapMessageStage.AfterDeserialize:
                    AfterDeserialize(message);
                    break;

                case SoapMessageStage.BeforeSerialize:
                    BeforeSerialize(message);
                    break;

                case SoapMessageStage.AfterSerialize:
                    AfterSerialize();
                    break;

                default: throw new InvalidOperationException("Invalid stage");
            }
        }

        private static Regex regexSoapSizeHeaderSize = new Regex(
           @"(?<before><soap:Header>.*?<SoapSizeHeader>)" +
           @"\d+" +
           @"(?<after></SoapSizeHeader>.*?</soap:Header>)",
           RegexOptions.IgnoreCase |
           RegexOptions.Singleline |
           RegexOptions.Compiled
           );

        private void BeforeDeserialize()
        {
            StreamReader input = new StreamReader(oldStream);
            soapInput = input.ReadToEnd();
            oldStream.Position = 0;

            int length = soapInput.Length;
            soapInput = regexSoapSizeHeaderSize.Replace(
                soapInput, "${before}" + length + "${after}", 1);

            StreamWriter output = new StreamWriter(newStream);
            output.Write(soapInput);
            output.Flush();
            newStream.Position = 0;
        }

        private void AfterDeserialize(SoapMessage message)
        {
            //foreach ( SoapHeader header in message.Headers )
            //{
            //    SoapSizeHeader soapSizeHeader = header as SoapSizeHeader;
            //
            //    if ( soapSizeHeader != null )
            //        soapSizeHeader.SoapSizeHeaderSize = soapInput.Length;
            //}

            soapInput = null;
        }

        private void BeforeSerialize(SoapMessage message)
        {

        }

        private void AfterSerialize()
        {
            newStream.Position = 0;
            StreamReader input = new StreamReader(newStream);
            string soap = input.ReadToEnd();

            int length = soap.Length;
            soap = regexSoapSizeHeaderSize.Replace(
                soap, "${before}" + length + "${after}", 1);

            StreamWriter output = new StreamWriter(oldStream);
            output.Write(soap);
            output.Flush();

        }
    }

    public class SoapSizeHeader : SoapHeader
    {
        private int size = 0;

        public int SoapSize
        {
            get { return size; }
            set { size = value; }
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -