技术开发 频道

通过压缩SOAP改善XML Web service性能

  服务端的SOAP扩展

  在服务端,为了减小SOAP响应的尺寸,它被压缩。下面这段告诉你怎么做:

  第一步

  使用Microsoft Visual Studio .NET, 我们创建一个新的Visual Basic .NET 类库项目(使用"ServerSoapExtension"作为项目名称),添加下面的类:

Imports System Imports System.Web.Services Imports System.Web.Services.Protocols Imports System.IO Imports zipper Public Class myextension Inherits SoapExtension Private networkStream As Stream Private newStream As Stream Public Overloads Overrides Function GetInitializer(ByVal _ methodInfo As LogicalMethodInfo, _ ByVal attribute As SoapExtensionAttribute) As Object Return System.DBNull.Value End Function Public Overloads Overrides Function GetInitializer(ByVal _ WebServiceType As Type) As Object Return System.DBNull.Value End Function Public Overrides Sub Initialize(ByVal initializer As Object) End Sub Public Overrides Sub ProcessMessage(ByVal message As SoapMessage) Select Case message.Stage Case SoapMessageStage.BeforeSerialize Case SoapMessageStage.AfterSerialize AfterSerialize(message) Case SoapMessageStage.BeforeDeserialize BeforeDeserialize(message) Case SoapMessageStage.AfterDeserialize Case Else Throw New Exception("invalid stage") End Select End Sub '' Save the stream representing the SOAP request or SOAP response into a '' local memory buffer. Public Overrides Function ChainStream(ByVal stream As Stream) As Stream networkStream = stream newStream = New MemoryStream() Return newStream End Function '' Write the compressed SOAP message out to a file at ''the server''s file system.. Public Sub AfterSerialize(ByVal message As SoapMessage) newStream.Position = 0 Dim fs As New FileStream("c:\temp\server_soap.txt", _ FileMode.Append, FileAccess.Write) Dim w As New StreamWriter(fs) w.WriteLine("-----Response at " + DateTime.Now.ToString()) w.Flush() ''Compress stream and save it to a file Comp(newStream, fs) w.Close() newStream.Position = 0 ''Compress stream and send it to the wire Comp(newStream, networkStream) End Sub '' Write the SOAP request message out to a file at the server''s file system. Public Sub BeforeDeserialize(ByVal message As SoapMessage) Copy(networkStream, newStream) Dim fs As New FileStream("c:\temp\server_soap.txt", _ FileMode.Create, FileAccess.Write) Dim w As New StreamWriter(fs) w.WriteLine("----- Request at " + DateTime.Now.ToString()) w.Flush() newStream.Position = 0 Copy(newStream, fs) w.Close() newStream.Position = 0 End Sub Sub Copy(ByVal fromStream As Stream, ByVal toStream As Stream) Dim reader As New StreamReader(fromStream) Dim writer As New StreamWriter(toStream) writer.WriteLine(reader.ReadToEnd()) writer.Flush() End Sub Sub Comp(ByVal fromStream As Stream, ByVal toStream As Stream) Dim reader As New StreamReader(fromStream) Dim writer As New StreamWriter(toStream) Dim test1 As String Dim test2 As String test1 = reader.ReadToEnd ''String compression using NZIPLIB test2 = zipper.Class1.Compress(test1) writer.WriteLine(test2) writer.Flush() End Sub End Class '' Create a SoapExtensionAttribute for the SOAP extension that can be '' applied to an XML Web service method. <AttributeUsage(AttributeTargets.Method)> _ Public Class myextensionattribute Inherits SoapExtensionAttribute Public Overrides ReadOnly Property ExtensionType() As Type Get Return GetType(myextension) End Get End Property Public Overrides Property Priority() As Integer Get Return 1 End Get Set(ByVal Value As Integer) End Set End Property End Class

  第二步

  我们增加ServerSoapExtension.dll程序集作为引用,并且在web.config声明SOAP扩展:

<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.web> <webServices> <soapExtensionTypes> <add type="ServerSoapExtension.myextension, ServerSoapExtension" priority="1" group="0"/> </soapExtensionTypes> </webServices> ... </system.web> </configuration>

   就象你在代码中看到的那样,我们使用了一个临时目录(“c:\temp”)来捕获SOAP请求和压缩过的SOAP响应到文本文件(“c:\temp\server_soap.txt”)中 。

0
相关文章