更新時間:2020-09-22 17:20:32 來源:動力節(jié)點 瀏覽1170次
在此之前,我們已經(jīng)學(xué)過不少程序的序列化和反序列化,而且對序列化和反序列化的概念已經(jīng)了然于心。通俗來講,序列化就是把內(nèi)存里面的這些對象給變成一連串的字節(jié)描述的過程,反序列化則反之。本文我們就一起來學(xué)習(xí)和探究Web Service序列化和反序列化。
在Web Service中,SoapExtension和SoapExtensionAttribute兩個類用于控制Web Service序列化和反序列化的一般過程,可對Web Service進行壓縮和日志等功能進行控制,同時還具有對整個Web Service傳輸?shù)膚sdl進行壓縮的功能。
SoapExtensionAttribute類:
public class ExtensionAttribute:SoapExtensionAttribute
{
int _priority = 1;
public override int Priority
{
get
{
return _priority;
}
set
{
_priority = value;
}
}
public override Type ExtensionType
{
get { return typeof(MyExtension); }//定義擴展soap的類型
}
}
這個SoapExtensionAttribute抽象類定義如下:
protected SoapExtensionAttribute();
// 返回結(jié)果:
// SOAP 擴展的 System.Type。
public abstract Type ExtensionType { get; }
// 返回結(jié)果:
// SOAP 擴展的優(yōu)先級。
SOAP 擴展分配優(yōu)先級,該優(yōu)先級有助于確定當配置多個 SOAP 擴展以便使用 XML Web 服務(wù)方法時執(zhí)行的相對順序。SOAP 擴展的優(yōu)先級越高,它的執(zhí)行與通過網(wǎng)絡(luò)發(fā)送或接收 SOAP 消息越近。SOAP 擴展屬于三個優(yōu)先級組中的任意一個。在每個組內(nèi),priority 屬性區(qū)別每個成員。priority 屬性越低,相對優(yōu)先級就越高(0 是最高的)。
public abstract int Priority { get; set; }
//以下為擴展的soapextension類
public class MyExtension:SoapExtension
{
public override object GetInitializer(Type serviceType)
{
return GetType();
}
public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
{
return null;
}
public override void Initialize(object initializer)
{
}
//這個override的方法會被調(diào)用四次
//分別是SoapMessageStage的BeforeSerialize,AfterSerialize,BeforeDeserialize,AfterDeserialize
public override void ProcessMessage(SoapMessage message)
{
if (message.Stage == SoapMessageStage.AfterDeserialize) //反序列化后處理
{
bool check = false;
foreach (SoapHeader header in message.Headers)
{
if (header is CertficateSoapHeader)
{
CertficateSoapHeader myHeader = (CertficateSoapHeader)header;
if (myHeader.UserName == null || myHeader.PassWord == null)
{
break;
}
if (myHeader.UserName.Equals("LY") && myHeader.PassWord.Equals("LY"))
{
check = true;
break;
}
}
}
if (!check)
{
throw new SoapHeaderException("認證失敗", SoapException.ClientFaultCode);
}
}
}
}
通過SoapMessage中的stream可以獲取發(fā)送和收到的流數(shù)據(jù),上面的功能實現(xiàn)了soapheader的權(quán)限認證,實現(xiàn)上面的類后,我們就不需要在webmethod中進行判斷,只需要加入相關(guān)的屬性即可,如:
public CertficateSoapHeader soapHeader;
[ExtensionAttribute]
[SoapHeader("soapHeader",Direction=SoapHeaderDirection.In)]
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
客戶端的調(diào)用和前面一樣,可見在Web Service中soapextension中的ProcessMessage就相當于一個攔截器,能對進入webmethod的stream進行相關(guān)的截獲。
綜上所述,Web Service序列化和反序列化依賴于SoapExtension和SoapExtensionAttribute兩個類。熟悉和熟練使用SoapExtension類和SoapExtensionAttribute類是我們掌握Web Service序列化和反序列化的關(guān)鍵所在。
初級 202925
初級 203221
初級 202629
初級 203743