服务端的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”)中 。
