构建安全的Xml Web Service系列之如何察看SoapMessage
生活随笔
收集整理的這篇文章主要介紹了
构建安全的Xml Web Service系列之如何察看SoapMessage
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
上一篇文章地址:構(gòu)建安全的Xml Web Service系列一之初探使用Soap頭 (5-22 12:53)????
???? 要分析Xml Web Service的安全性,首先要解決的問題是我們能了解和清楚Soap消息的格式和內(nèi)容,如果獲得不了SoapMessage,分析如何能構(gòu)建安全Xml web service也就無從下手,即使分析出來,自己也可 能模模糊糊,不能定論。下面就分析下如何獲得SoapMessage。
??? 首先介紹一個類-SoapExtension,msdn對這個類的備注為:ASP.NET 允許通過擴(kuò)展性機(jī)制生成與 SOAP 相關(guān)的基礎(chǔ)結(jié)構(gòu)。ASP.NET SOAP 擴(kuò)展結(jié)構(gòu)以一種擴(kuò)展為中心,該擴(kuò)展可以在客戶端或服務(wù)器上處理消息時在特定階段中檢查或修改消息。ASP.NET SOAP 擴(kuò)展從 SoapExtension 類派生。GetInitializer 和 Initialize 方法提供其他可用機(jī)制,用于初始化 SOAP 擴(kuò)展以增強性能。ProcessMessage 是大多數(shù) SOAP 擴(kuò)展的核心,原因是該方法在 SoapMessageStage 中定義的每一個階段都被調(diào)用,從而使 SOAP 擴(kuò)展得以執(zhí)行所需的該特定 SOAP 擴(kuò)展的行為。對于需要修改 SOAP 請求或 SOAP 響應(yīng)的 SOAP 擴(kuò)展,ChainStream 提供一個機(jī)會以接收要通過網(wǎng)絡(luò)發(fā)送的建議數(shù)據(jù)。 仔細(xì)閱讀這段文字,如果您以前開發(fā)過windows程序,那第一個應(yīng)該想到的是:原來web service的處理機(jī)制和windows窗口程序的消息機(jī)制竟然有著一曲同工之妙。下面談?wù)勅绾卫眠@個類,來截獲Xml web Service請求和相應(yīng)的Soap消息,從而看看xml web service的廬山真面目。
??? 首先大家先看看這個類,這個類完成的功能是將Xml Web Service通過擴(kuò)展的方式,將每次的請求和響應(yīng)的Soap消息通過日志的方式保存到文本文件中。日志記錄的方式也有兩種:
??? 1。針對每個WebMethod產(chǎn)生一個日志文件。
????2。針對每個WebService產(chǎn)生一個日志文件
?因為一個WebService可能包含一個或者多個WebMethod,所以如果指定兩種方法都支持的話,那第二個日志兩面應(yīng)該包括第一個日志里面的內(nèi)容,而有些情況下,是不需要對每個WebMethod都進(jìn)行日志記錄的,這時候采用第一種記錄方式,增強了系統(tǒng)的靈活性。?
下面是擴(kuò)展了的SoapExtension
?<webServices>
????????<soapExtensionTypes>
??????????<add?type="Jillzhang.TraceExtension,Jillzhang"?priority="1"??group="High"??/>
????????</soapExtensionTypes>
??????</webServices> 可以記錄SoapMessage的SoapExtension
namespace?Jillzhang
{
????public?class?TraceExtension:?SoapExtension
????{
????????static?readonly?string?LogRoot?=?System.Configuration.ConfigurationManager.AppSettings["logRoot"];
????????Stream?oldStream;
????????Stream?newStream;
????????string?filename;
???????///?<summary>
???????///?將請求流和響應(yīng)流存到內(nèi)存流中,已被調(diào)用
???????///?</summary>
????????///?<param?name="stream">包含?SOAP?請求或響應(yīng)的內(nèi)存緩沖區(qū)</param>
????????///?<returns>它表示此?SOAP?擴(kuò)展可以修改的新內(nèi)存緩沖區(qū)。</returns>
????????public?override?Stream?ChainStream(Stream?stream)
????????{
????????????oldStream?=?stream;
????????????newStream?=?new?MemoryStream();
????????????return?newStream;
????????}
????????///?<summary>
????????///?在Xml?Web?Service第一次運行的時候,一次性的將通過TraceExtensionAttribute傳遞進(jìn)來的
????????///?保存日志信息的文件名初始化
????????///?</summary>
????????///?<param?name="methodInfo">應(yīng)用?SOAP?擴(kuò)展的?XML?Web?services?方法的特定函數(shù)原型</param>
????????///?<param?name="attribute">應(yīng)用于?XML?Web?services?方法的?SoapExtensionAttribute</param>
????????///?<returns>SOAP?擴(kuò)展將對其進(jìn)行初始化以用于緩存</returns>
????????public?override?object?GetInitializer(LogicalMethodInfo?methodInfo,?SoapExtensionAttribute?attribute)
????????{
????????????return?((TraceExtensionAttribute)attribute).Filename;
????????}
????????///?<summary>
????????///?替代為每個方法配置的保存SoapMessage文件名,而是將整個網(wǎng)絡(luò)服務(wù)
????????///?的SoapMessage都保存到一個日志文件中,這個文件路徑需要在Web?Service
????????///?的配置文件中web.config指出,如
????????///?<appSettings>
????????///??<add?key="logRoot"?value="c:\\serviceLog"/>
????????///?</appSettings>
????????///?</summary>
????????///?<param?name="WebServiceType">網(wǎng)絡(luò)服務(wù)的類型</param>
????????///?<returns>用于保存日志記錄的文件路徑</returns>
????????public?override?object?GetInitializer(Type?WebServiceType)
????????{
????????????//return?LogRoot.TrimEnd('\\')?+?"\\"?+?WebServiceType.FullName?+?".log";
????????????return?LogRoot.TrimEnd('\\')+"\\"+?WebServiceType.FullName?+?".log";
????????}
????????//獲得文件名,并將其保存下來
????????public?override?void?Initialize(object?initializer)
????????{
????????????filename?=?(string)initializer;
????????}
???????///?<summary>
???????///?當(dāng)數(shù)據(jù)還為Soap格式的時候,將數(shù)據(jù)寫入日志
???????///?</summary>
???????///?<param?name="message"></param>
????????public?override?void?ProcessMessage(SoapMessage?message)
????????{
????????????switch?(message.Stage)
????????????{
????????????????case?SoapMessageStage.BeforeSerialize:
????????????????????break;
????????????????case?SoapMessageStage.AfterSerialize:
????????????????????WriteOutput(message);
????????????????????break;
????????????????case?SoapMessageStage.BeforeDeserialize:
????????????????????WriteInput(message);
????????????????????break;
????????????????case?SoapMessageStage.AfterDeserialize:
????????????????????break;
????????????????default:
????????????????????throw?new?Exception("invalid?stage");
????????????}
????????}
????????///?<summary>
????????///?將SoapMessage寫入到日志文件
????????///?</summary>
????????///?<param?name="message"></param>
????????public?void?WriteOutput(SoapMessage?message)
????????{
????????????newStream.Position?=?0;?
????????????//創(chuàng)建或追加記錄文件
????????????FileStream?fs?=?new?FileStream(filename,?FileMode.Append,
????????????????FileAccess.Write);
????????????StreamWriter?w?=?new?StreamWriter(fs);
????????????string?soapString?=?(message?is?SoapServerMessage)???"Soap響應(yīng)"?:?"Soap請求";
????????????w.WriteLine("-----"?+?soapString?+?"?在?"?+?DateTime.Now.ToString("yyyy年MM月dd日?HH時mm分ss秒"));
????????????w.Flush();
????????????Copy(newStream,?fs);
????????????w.Close();
????????????newStream.Position?=?0;
????????????Copy(newStream,?oldStream);
????????}
????????public?void?WriteInput(SoapMessage?message)
????????{
????????????Copy(oldStream,?newStream);
????????????FileStream?fs?=?new?FileStream(filename,?FileMode.Append,
????????????????FileAccess.Write);
????????????StreamWriter?w?=?new?StreamWriter(fs);
????????????string?soapString?=?(message?is?SoapServerMessage)??
?????????????????"Soap請求"?:?"Soap響應(yīng)";
????????????w.WriteLine("-----"?+?soapString?+
????????????????"?在?"?+?DateTime.Now.ToString("yyyy年MM月dd日?HH時mm分ss秒"));
????????????w.Flush();
????????????newStream.Position?=?0;
????????????Copy(newStream,?fs);
????????????w.Close();
????????????newStream.Position?=?0;
????????}
????????///?<summary>
????????///?拷貝流到流
????????///?</summary>
????????///?<param?name="from"></param>
????????///?<param?name="to"></param>
????????void?Copy(Stream?from,?Stream?to)
????????{
????????????TextReader?reader?=?new?StreamReader(from);
????????????TextWriter?writer?=?new?StreamWriter(to);
????????????writer.WriteLine(reader.ReadToEnd());
????????????writer.Flush();
????????}
????}
????//創(chuàng)建一個用于在WebMethod上使用的SoapExtension屬性
????[AttributeUsage(AttributeTargets.Method)]
????public?class?TraceExtensionAttribute?:?SoapExtensionAttribute
????{
????????private?string?filename?=?"c:\\log.txt";
????????private?int?priority;
????????///?<summary>
????????///?擴(kuò)展類型
????????///?</summary>
????????public?override?Type?ExtensionType
????????{
????????????get?{?return?typeof(TraceExtension);?}
????????}
????????///?<summary>
????????///?優(yōu)先級?
????????///?</summary>
????????public?override?int?Priority
????????{
????????????get?{?return?priority;?}
????????????set?{?priority?=?value;?}
????????}
????????///?<summary>
????????///?用于記錄該WebMethod的SoapMessage的文件的絕對路徑
????????///?默認(rèn)為c:\\log.txt;
????????///?</summary>
????????public?string?Filename
????????{
????????????get
????????????{
????????????????return?filename;
????????????}
????????????set
????????????{
????????????????filename?=?value;
????????????}
????????}
????}???
}
結(jié)下來,介紹一個如何使用該類:
如果要使讓TraceExtension支持第一種記錄方式,需要作的額外工作為:
只需要在要記錄SoapMessage的WebMethod添加如下的Attribute
[TraceExtension(Filename="d:\\data.xml",Priority=0)]
當(dāng)然路徑,您可以自己設(shè)定
前一節(jié)的WebMethod就變成了
添加了針對WebMethod日志記錄的WebMethod
?public?MySoapHeader?header?=?new?MySoapHeader();????????
????????[WebMethod]
????????[SoapHeader("header")]???
????????[TraceExtension(Filename="d:\\data.xml",Priority=0)]
????????public?string?HelloWorld()
????????{
????????????if?(header?==?null)
????????????{
????????????????return?"您沒有設(shè)置SoapHeader,不能正常訪問此服務(wù)!";
????????????}
????????????if?(header.UserName?!=?"jillzhang"?||?header.Pwd?!=?"123456")
????????????{
????????????????return?"您提供的身份驗證信息有誤,不能正常訪問此服務(wù)!";
????????????}
????????????return?"Hello?World";
????????} 調(diào)用下該WebService,便在d盤產(chǎn)生一個data.xml文件,里面的內(nèi)容為:
日志記錄
-----Soap請求?在?2007年05月25日?09時06分29秒
<?xml?version="1.0"?encoding="utf-8"?><soap:Envelope?xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Header><MySoapHeader?xmlns="http://tempuri.org/"><UserName>jillzhang</UserName><Pwd>123456</Pwd></MySoapHeader></soap:Header><soap:Body><HelloWorld?xmlns="http://tempuri.org/"?/></soap:Body></soap:Envelope>
-----Soap響應(yīng)?在?2007年05月25日?09時06分29秒
<?xml?version="1.0"?encoding="utf-8"?><soap:Envelope?xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><HelloWorldResponse?xmlns="http://tempuri.org/"><HelloWorldResult>Hello?World</HelloWorldResult></HelloWorldResponse></soap:Body></soap:Envelope>
如何采用第二種方法,讓W(xué)ebService的每個WebMethod都能記錄日志
需要在Web.config中作如下的設(shè)定
首先添加如下節(jié)點
?<webServices>
????????<soapExtensionTypes>
??????????<add?type="Jillzhang.TraceExtension,Jillzhang"?priority="1"??group="High"??/>
????????</soapExtensionTypes>
??????</webServices> 然后通過配置設(shè)定日志文件保留的路徑: <appSettings>
????<add?key="logRoot"?value="d:"/>
??</appSettings> 找到日志文件,里面也赫然有著SoapMessage的真面目。通過以上方法,大家可以清晰地分析到SoapMessage的具體格式和內(nèi)容,知道了這個以后,對付Web Service,您就可以隨心應(yīng)手,隨心所欲,如果你愿意,你甚至也可以“強奸"一次webservice,哈哈!
上一篇文章地址:構(gòu)建安全的Xml Web Service系列一之初探使用Soap頭 (5-22 12:53)
附:終于買上房了,雖然買的過程很累,但現(xiàn)在還是很Happy!
???? 要分析Xml Web Service的安全性,首先要解決的問題是我們能了解和清楚Soap消息的格式和內(nèi)容,如果獲得不了SoapMessage,分析如何能構(gòu)建安全Xml web service也就無從下手,即使分析出來,自己也可 能模模糊糊,不能定論。下面就分析下如何獲得SoapMessage。
??? 首先介紹一個類-SoapExtension,msdn對這個類的備注為:ASP.NET 允許通過擴(kuò)展性機(jī)制生成與 SOAP 相關(guān)的基礎(chǔ)結(jié)構(gòu)。ASP.NET SOAP 擴(kuò)展結(jié)構(gòu)以一種擴(kuò)展為中心,該擴(kuò)展可以在客戶端或服務(wù)器上處理消息時在特定階段中檢查或修改消息。ASP.NET SOAP 擴(kuò)展從 SoapExtension 類派生。GetInitializer 和 Initialize 方法提供其他可用機(jī)制,用于初始化 SOAP 擴(kuò)展以增強性能。ProcessMessage 是大多數(shù) SOAP 擴(kuò)展的核心,原因是該方法在 SoapMessageStage 中定義的每一個階段都被調(diào)用,從而使 SOAP 擴(kuò)展得以執(zhí)行所需的該特定 SOAP 擴(kuò)展的行為。對于需要修改 SOAP 請求或 SOAP 響應(yīng)的 SOAP 擴(kuò)展,ChainStream 提供一個機(jī)會以接收要通過網(wǎng)絡(luò)發(fā)送的建議數(shù)據(jù)。 仔細(xì)閱讀這段文字,如果您以前開發(fā)過windows程序,那第一個應(yīng)該想到的是:原來web service的處理機(jī)制和windows窗口程序的消息機(jī)制竟然有著一曲同工之妙。下面談?wù)勅绾卫眠@個類,來截獲Xml web Service請求和相應(yīng)的Soap消息,從而看看xml web service的廬山真面目。
??? 首先大家先看看這個類,這個類完成的功能是將Xml Web Service通過擴(kuò)展的方式,將每次的請求和響應(yīng)的Soap消息通過日志的方式保存到文本文件中。日志記錄的方式也有兩種:
??? 1。針對每個WebMethod產(chǎn)生一個日志文件。
????2。針對每個WebService產(chǎn)生一個日志文件
?因為一個WebService可能包含一個或者多個WebMethod,所以如果指定兩種方法都支持的話,那第二個日志兩面應(yīng)該包括第一個日志里面的內(nèi)容,而有些情況下,是不需要對每個WebMethod都進(jìn)行日志記錄的,這時候采用第一種記錄方式,增強了系統(tǒng)的靈活性。?
下面是擴(kuò)展了的SoapExtension
?<webServices>
????????<soapExtensionTypes>
??????????<add?type="Jillzhang.TraceExtension,Jillzhang"?priority="1"??group="High"??/>
????????</soapExtensionTypes>
??????</webServices> 可以記錄SoapMessage的SoapExtension
namespace?Jillzhang
{
????public?class?TraceExtension:?SoapExtension
????{
????????static?readonly?string?LogRoot?=?System.Configuration.ConfigurationManager.AppSettings["logRoot"];
????????Stream?oldStream;
????????Stream?newStream;
????????string?filename;
???????///?<summary>
???????///?將請求流和響應(yīng)流存到內(nèi)存流中,已被調(diào)用
???????///?</summary>
????????///?<param?name="stream">包含?SOAP?請求或響應(yīng)的內(nèi)存緩沖區(qū)</param>
????????///?<returns>它表示此?SOAP?擴(kuò)展可以修改的新內(nèi)存緩沖區(qū)。</returns>
????????public?override?Stream?ChainStream(Stream?stream)
????????{
????????????oldStream?=?stream;
????????????newStream?=?new?MemoryStream();
????????????return?newStream;
????????}
????????///?<summary>
????????///?在Xml?Web?Service第一次運行的時候,一次性的將通過TraceExtensionAttribute傳遞進(jìn)來的
????????///?保存日志信息的文件名初始化
????????///?</summary>
????????///?<param?name="methodInfo">應(yīng)用?SOAP?擴(kuò)展的?XML?Web?services?方法的特定函數(shù)原型</param>
????????///?<param?name="attribute">應(yīng)用于?XML?Web?services?方法的?SoapExtensionAttribute</param>
????????///?<returns>SOAP?擴(kuò)展將對其進(jìn)行初始化以用于緩存</returns>
????????public?override?object?GetInitializer(LogicalMethodInfo?methodInfo,?SoapExtensionAttribute?attribute)
????????{
????????????return?((TraceExtensionAttribute)attribute).Filename;
????????}
????????///?<summary>
????????///?替代為每個方法配置的保存SoapMessage文件名,而是將整個網(wǎng)絡(luò)服務(wù)
????????///?的SoapMessage都保存到一個日志文件中,這個文件路徑需要在Web?Service
????????///?的配置文件中web.config指出,如
????????///?<appSettings>
????????///??<add?key="logRoot"?value="c:\\serviceLog"/>
????????///?</appSettings>
????????///?</summary>
????????///?<param?name="WebServiceType">網(wǎng)絡(luò)服務(wù)的類型</param>
????????///?<returns>用于保存日志記錄的文件路徑</returns>
????????public?override?object?GetInitializer(Type?WebServiceType)
????????{
????????????//return?LogRoot.TrimEnd('\\')?+?"\\"?+?WebServiceType.FullName?+?".log";
????????????return?LogRoot.TrimEnd('\\')+"\\"+?WebServiceType.FullName?+?".log";
????????}
????????//獲得文件名,并將其保存下來
????????public?override?void?Initialize(object?initializer)
????????{
????????????filename?=?(string)initializer;
????????}
???????///?<summary>
???????///?當(dāng)數(shù)據(jù)還為Soap格式的時候,將數(shù)據(jù)寫入日志
???????///?</summary>
???????///?<param?name="message"></param>
????????public?override?void?ProcessMessage(SoapMessage?message)
????????{
????????????switch?(message.Stage)
????????????{
????????????????case?SoapMessageStage.BeforeSerialize:
????????????????????break;
????????????????case?SoapMessageStage.AfterSerialize:
????????????????????WriteOutput(message);
????????????????????break;
????????????????case?SoapMessageStage.BeforeDeserialize:
????????????????????WriteInput(message);
????????????????????break;
????????????????case?SoapMessageStage.AfterDeserialize:
????????????????????break;
????????????????default:
????????????????????throw?new?Exception("invalid?stage");
????????????}
????????}
????????///?<summary>
????????///?將SoapMessage寫入到日志文件
????????///?</summary>
????????///?<param?name="message"></param>
????????public?void?WriteOutput(SoapMessage?message)
????????{
????????????newStream.Position?=?0;?
????????????//創(chuàng)建或追加記錄文件
????????????FileStream?fs?=?new?FileStream(filename,?FileMode.Append,
????????????????FileAccess.Write);
????????????StreamWriter?w?=?new?StreamWriter(fs);
????????????string?soapString?=?(message?is?SoapServerMessage)???"Soap響應(yīng)"?:?"Soap請求";
????????????w.WriteLine("-----"?+?soapString?+?"?在?"?+?DateTime.Now.ToString("yyyy年MM月dd日?HH時mm分ss秒"));
????????????w.Flush();
????????????Copy(newStream,?fs);
????????????w.Close();
????????????newStream.Position?=?0;
????????????Copy(newStream,?oldStream);
????????}
????????public?void?WriteInput(SoapMessage?message)
????????{
????????????Copy(oldStream,?newStream);
????????????FileStream?fs?=?new?FileStream(filename,?FileMode.Append,
????????????????FileAccess.Write);
????????????StreamWriter?w?=?new?StreamWriter(fs);
????????????string?soapString?=?(message?is?SoapServerMessage)??
?????????????????"Soap請求"?:?"Soap響應(yīng)";
????????????w.WriteLine("-----"?+?soapString?+
????????????????"?在?"?+?DateTime.Now.ToString("yyyy年MM月dd日?HH時mm分ss秒"));
????????????w.Flush();
????????????newStream.Position?=?0;
????????????Copy(newStream,?fs);
????????????w.Close();
????????????newStream.Position?=?0;
????????}
????????///?<summary>
????????///?拷貝流到流
????????///?</summary>
????????///?<param?name="from"></param>
????????///?<param?name="to"></param>
????????void?Copy(Stream?from,?Stream?to)
????????{
????????????TextReader?reader?=?new?StreamReader(from);
????????????TextWriter?writer?=?new?StreamWriter(to);
????????????writer.WriteLine(reader.ReadToEnd());
????????????writer.Flush();
????????}
????}
????//創(chuàng)建一個用于在WebMethod上使用的SoapExtension屬性
????[AttributeUsage(AttributeTargets.Method)]
????public?class?TraceExtensionAttribute?:?SoapExtensionAttribute
????{
????????private?string?filename?=?"c:\\log.txt";
????????private?int?priority;
????????///?<summary>
????????///?擴(kuò)展類型
????????///?</summary>
????????public?override?Type?ExtensionType
????????{
????????????get?{?return?typeof(TraceExtension);?}
????????}
????????///?<summary>
????????///?優(yōu)先級?
????????///?</summary>
????????public?override?int?Priority
????????{
????????????get?{?return?priority;?}
????????????set?{?priority?=?value;?}
????????}
????????///?<summary>
????????///?用于記錄該WebMethod的SoapMessage的文件的絕對路徑
????????///?默認(rèn)為c:\\log.txt;
????????///?</summary>
????????public?string?Filename
????????{
????????????get
????????????{
????????????????return?filename;
????????????}
????????????set
????????????{
????????????????filename?=?value;
????????????}
????????}
????}???
}
結(jié)下來,介紹一個如何使用該類:
如果要使讓TraceExtension支持第一種記錄方式,需要作的額外工作為:
只需要在要記錄SoapMessage的WebMethod添加如下的Attribute
[TraceExtension(Filename="d:\\data.xml",Priority=0)]
當(dāng)然路徑,您可以自己設(shè)定
前一節(jié)的WebMethod就變成了
添加了針對WebMethod日志記錄的WebMethod
?public?MySoapHeader?header?=?new?MySoapHeader();????????
????????[WebMethod]
????????[SoapHeader("header")]???
????????[TraceExtension(Filename="d:\\data.xml",Priority=0)]
????????public?string?HelloWorld()
????????{
????????????if?(header?==?null)
????????????{
????????????????return?"您沒有設(shè)置SoapHeader,不能正常訪問此服務(wù)!";
????????????}
????????????if?(header.UserName?!=?"jillzhang"?||?header.Pwd?!=?"123456")
????????????{
????????????????return?"您提供的身份驗證信息有誤,不能正常訪問此服務(wù)!";
????????????}
????????????return?"Hello?World";
????????} 調(diào)用下該WebService,便在d盤產(chǎn)生一個data.xml文件,里面的內(nèi)容為:
日志記錄
-----Soap請求?在?2007年05月25日?09時06分29秒
<?xml?version="1.0"?encoding="utf-8"?><soap:Envelope?xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Header><MySoapHeader?xmlns="http://tempuri.org/"><UserName>jillzhang</UserName><Pwd>123456</Pwd></MySoapHeader></soap:Header><soap:Body><HelloWorld?xmlns="http://tempuri.org/"?/></soap:Body></soap:Envelope>
-----Soap響應(yīng)?在?2007年05月25日?09時06分29秒
<?xml?version="1.0"?encoding="utf-8"?><soap:Envelope?xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><HelloWorldResponse?xmlns="http://tempuri.org/"><HelloWorldResult>Hello?World</HelloWorldResult></HelloWorldResponse></soap:Body></soap:Envelope>
如何采用第二種方法,讓W(xué)ebService的每個WebMethod都能記錄日志
需要在Web.config中作如下的設(shè)定
首先添加如下節(jié)點
?<webServices>
????????<soapExtensionTypes>
??????????<add?type="Jillzhang.TraceExtension,Jillzhang"?priority="1"??group="High"??/>
????????</soapExtensionTypes>
??????</webServices> 然后通過配置設(shè)定日志文件保留的路徑: <appSettings>
????<add?key="logRoot"?value="d:"/>
??</appSettings> 找到日志文件,里面也赫然有著SoapMessage的真面目。通過以上方法,大家可以清晰地分析到SoapMessage的具體格式和內(nèi)容,知道了這個以后,對付Web Service,您就可以隨心應(yīng)手,隨心所欲,如果你愿意,你甚至也可以“強奸"一次webservice,哈哈!
上一篇文章地址:構(gòu)建安全的Xml Web Service系列一之初探使用Soap頭 (5-22 12:53)
附:終于買上房了,雖然買的過程很累,但現(xiàn)在還是很Happy!
總結(jié)
以上是生活随笔為你收集整理的构建安全的Xml Web Service系列之如何察看SoapMessage的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: postsql获取表字段信息SQL
- 下一篇: [react] React怎么判断什么时