📄 soapsizeextension.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 + -