<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
        My Github

      .NET基礎(chǔ)拾遺(7)Web Service的開發(fā)與應(yīng)用基礎(chǔ)

       Index :

      (1)類型語法、內(nèi)存管理和垃圾回收基礎(chǔ)

      (2)面向?qū)ο蟮膶崿F(xiàn)和異常的處理

      (3)字符串、集合與流

      (4)委托、事件、反射與特性

      (5)多線程開發(fā)基礎(chǔ)

      (6)ADO.NET與數(shù)據(jù)庫開發(fā)基礎(chǔ)

      (7)WebService的開發(fā)與應(yīng)用基礎(chǔ)

      一、SOAP和Web Service的基本概念

        Web Service基于SOAP協(xié)議,而SOAP本身符合XML語法規(guī)范。雖然.NET為Web Service提供了強大的支持,但了解其基本機制對于程序員來說仍然是必需的。

      1.1 神馬是SOAP協(xié)議?

        SOAP協(xié)議的全稱是簡單對象訪問協(xié)議(Simple Object Access Protocol),SOAP致力于以XML形式提供一個簡單、輕量的用于在分散或分布環(huán)境中交換結(jié)構(gòu)化和類型信息的機制。SOAP只規(guī)范對象訪問的方式,而不限制具體實現(xiàn)的技術(shù)環(huán)境,這意味著SOAP協(xié)議是一種跨平臺的協(xié)議:一個.NET客戶端程序可以按照SOAP協(xié)議訪問一個基于JavaEE技術(shù)體系結(jié)構(gòu)的Web Service。SOAP訪問仍然基于HTTP協(xié)議,同時其內(nèi)容又以XML形式展現(xiàn)。

        SOAP規(guī)范由四部分組成:

        ① SOAP信封(SOAP envelop)

        ② SOAP編碼規(guī)則(SOAP encoding rules)

        ③ SOAP RPC表示(SOAP RPC representation)

        ④ SOAP綁定(SOAP binding)

        這里不對這四部分展開介紹,通過下面的一個小例子來直觀地認(rèn)識一下。

        (1)在Web服務(wù)端,打算對外提供一個公共方法來供客戶端調(diào)用,而客戶端則需要提供這個方法需要的參數(shù),并且最終得到返回值。假設(shè)這個方法被申明在MySimpleService.asmx文件中:

          [WebMethod]
          public string GetSumString(int para1, int para2)
          {
              int result = para1 + para2;
              return result.ToString();
          }

        (2)當(dāng)客戶端試圖使用這個Web Service方法時,就需要向服務(wù)器端發(fā)出這樣的一個HTTP請求:

      POST /MySimpleService.asmx HTTP/1.1
      Host: localhost
      Content-Type: text/xml; charset=utf-8
      Content-Length: length
      SOAPAction: "http://tempuri.org/GetSumString"
      
      <?xml version="1.0" encoding="utf-8"?>
      <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <soap:Body>
          <GetSumString xmlns="http://tempuri.org/">
            <para1>250</para1>
            <para2>250</para2>
          </GetSumString>
        </soap:Body>
      </soap:Envelope>

        (3)等到Web Service服務(wù)器端接收到上面的請求之后,就可以進行相應(yīng)的邏輯處理,并且返回結(jié)果。根據(jù)SOAP協(xié)議,HTTP響應(yīng)如下形式:

      HTTP/1.1 200 OK
      Content-Type: text/xml; charset=utf-8
      Content-Length: length
      
      <?xml version="1.0" encoding="utf-8"?>
      <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <soap:Body>
          <GetSumStringResponse xmlns="http://tempuri.org/">
            <GetSumStringResult>500</GetSumStringResult>
          </GetSumStringResponse>
        </soap:Body>
      </soap:Envelope>

        如此一來,客戶端就得到了服務(wù)端的處理結(jié)果,換句話說,客戶端已經(jīng)得到了Web Service提供的服務(wù)。

      PS:最后,再說一下SOAP協(xié)議和HTTP協(xié)議,它們的關(guān)系非常類似于網(wǎng)絡(luò)分層中的上下層協(xié)議,使用SOAP協(xié)議的雙方將SOAP數(shù)據(jù)包放入HTTP報文之中,并且通過HTTP協(xié)議完成實際的傳輸,換句話說,SOAP是對HTTP的一個封裝,下圖說明了這一過程:

      1.2 WSDL又是什么鬼,它有啥作用?

        (1)WSDL介紹

        WSDL(Web Service Description Language)是Web服務(wù)描述語言,它是一種由微軟、IBM、Intel等大型供應(yīng)商提出的語言規(guī)范,目的就是為了描述Web服務(wù)器所提供的服務(wù),以供使用者參考。WSDL是一種復(fù)合XML語法規(guī)范的語言,它的設(shè)計完全基于SOAP協(xié)議,當(dāng)一個Web Service服務(wù)器期望為使用者提供服務(wù)說明時,WSDL是最好的選擇之一。

        這里仍以上面的實例來說明,在Web服務(wù)端提供了這樣一個方法:

          string GetSumString(int para1, int para2)

        當(dāng)服務(wù)端視圖利用WSDL告訴客戶端如何使用該方法時,就會提供下面的這樣一個WSDL文件(仍然是一個XML):

      <?xml version="1.0" encoding="utf-8"?>
      <wsdl:definitions xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
        <wsdl:types>
          <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
            <s:element name="GetSumString">
              <s:complexType>
                <s:sequence>
                  <s:element minOccurs="1" maxOccurs="1" name="para1" type="s:int" />
                  <s:element minOccurs="1" maxOccurs="1" name="para2" type="s:int" />
                </s:sequence>
              </s:complexType>
            </s:element>
            <s:element name="GetSumStringResponse">
              <s:complexType>
                <s:sequence>
                  <s:element minOccurs="0" maxOccurs="1" name="GetSumStringResult" type="s:string" />
                </s:sequence>
              </s:complexType>
            </s:element>
          </s:schema>
        </wsdl:types>
        <wsdl:message name="GetSumStringSoapIn">
          <wsdl:part name="parameters" element="tns:GetSumString" />
        </wsdl:message>
        <wsdl:message name="GetSumStringSoapOut">
          <wsdl:part name="parameters" element="tns:GetSumStringResponse" />
        </wsdl:message>
        <!-- 這里省略其他定義 -->
      </wsdl:definitions>
      View Code

        如上xml所示,在<wsdl:types>節(jié)點下,WSDL定義了GetSumString方法的名字:

      <s:element name="GetSumString">

        參數(shù)數(shù)量、每個參數(shù)的類型:

      <s:complexType>
         <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="para1" type="s:int" />
            <s:element minOccurs="1" maxOccurs="1" name="para2" type="s:int" />
         </s:sequence>
      </s:complexType>

        以及返回參數(shù)的類型:

      <s:element name="GetSumStringResponse">
         <s:complexType>
            <s:sequence>
               <s:element minOccurs="0" maxOccurs="1" name="GetSumStringResult" type="s:string" />
            </s:sequence>
         </s:complexType>
      </s:element>

        通過完整的描述,使用者就能夠了解如何使用該Web服務(wù)了。

        (2)獲取和使用WSDL

        當(dāng)Web Service服務(wù)器提供WSDL時,就可以通過特定的工具獲得WSDL文件。最直接的方式就是在URL中直接添加WSDL參數(shù),來發(fā)送得到WSDL文件的請求,如下所示:

        http://localhost:6105/MySimpleService.asmx?wsdl

        這時點擊回車就可以得到如下圖所示的WSDL結(jié)果:

      1.3 Web Service中如何處理附件?

        盡管Web Service提供的方法的參數(shù)類型沒有任何限制,也就意味著所有的附件可以通過字節(jié)數(shù)組來進行傳遞,但是把字節(jié)流直接內(nèi)嵌在SOAP消息的做法有很多問題,這也曾經(jīng)成為XML語法和SOAP協(xié)議被詬病的原因。這里主要介紹一下XOP的概念。

        在XOP出現(xiàn)之前,SOAP處理二進制數(shù)據(jù)的方式都很簡單,比如當(dāng)一個Web Service服務(wù)端提供了如下的方法時:

          void UploadSmallAttach(Byte[] attachment)

        客戶端調(diào)用該Web Service,只需要發(fā)出下面這樣的SOAP請求即可:

      <?xml version="1.0" encoding="utf-8"?>
      <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <soap:Body>
          <UploadSmallAttach xmlns="http://tempuri.org/">
            <attachment>D0CF11E0A1B11AE100000000000000000000000003E0000300FEFF09000600000000000000000000000600000000000000000000DE0200000000000000000000001000000000000000FEFFFFFFFF00000000000000000000D80200000000000D9020000DA02000DB02000000DC020000DD0200000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF</attachment>
          </UploadSmallAttach>
        </soap:Body>
      </soap:Envelope>

        如上所示,其中<attachment>節(jié)點下的一大堆字符,就是某個文件的字節(jié)流。通過這種方式,確實是可以實現(xiàn)傳送二進制附件的功能的,但這樣的處理過于粗略,且傳輸沒有任何優(yōu)化。W3C為此特別指定了XOP規(guī)范。

        XOP(XML-binary Optimized Packages)意為XML二進制打包,它把二進制數(shù)據(jù)流從SOAP消息中分離出來,進行單獨打包。上述的客戶端請求如果使用XOP規(guī)范的話,將轉(zhuǎn)變?yōu)槿缦陆Y(jié)果:

      <?xml version="1.0" encoding="utf-8"?>
      <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <soap:Body>
          <UploadSmallAttach xmlns="http://tempuri.org/">
            <attachment>
           <
      xop:Include xmlns="http://www.w3.org/2015/10/02/xop/include" href="cid:http://www.book.com/attachment.png" />
          </
      attachment> </UploadSmallAttach> </soap:Body> </soap:Envelope>

        可以看到,原本出現(xiàn)在二進制字節(jié)流的地方,被轉(zhuǎn)換成了一個引用:

         <attachment>
         <xop:Include xmlns="http://www.w3.org/2015/10/02/xop/include" href="cid:http://www.book.com/attachment.png" />
        </attachment>

        這樣整個SOAP信封節(jié)點下就不再包含任何二進制直接,而福建則被安放在另一個MIME體中:

      Content-Type: image/png
      Content-Transfer-Encoding: binary
      Content-ID: <sample@book.com>
      D0CF11E0A1B11AE100000000000000000000000003E0000300FEFF09000600000000000000000000000600000000000000000000DE0200000000000000000000001000000000000000FEFFFFFFFF00000000000000000000D80200000000000D9020000DA02000DB02000000DC020000DD0200000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

      二、使用.NET開發(fā)Web Service

        .NET為Web Service提供了全面的支持,無論是創(chuàng)建Web Service還是訪問Web Service,使用.NET都能快速有效地完成需求。

      2.1 如何在.NET中創(chuàng)建Web Service?

        (1)使用WebMethod特性創(chuàng)建Web Service

        在.NET中,所有Web Service的資源被定義為asmx文件,而在ASP.NET被安裝時,asmx文件也會在IIS中被注冊成由ASP.NET組件來處理。也就是說,一個asmx文件和其后臺代碼asmx.cs組成了一個Web Service資源。

        為了讓我們能夠把注意力集中在邏輯的處理上,而忽略SOAP通信的工作,.NET提供了Web Service類型和WebMethod特性。在繼承自Web Service類型的公共方法上添加WebMethod特性,就可以申明為一個Web Service方法。

        ① 創(chuàng)建一個Web服務(wù)

        ② asmx文件只是簡單地聲明了后臺代碼的位置,而不包含任何工作代碼。后臺代碼都在asmx.cs中:

          /// <summary>
          /// MySimpleService 的摘要說明
          /// </summary>
          [WebService(Namespace = "http://tempuri.org/")]
          [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
          [System.ComponentModel.ToolboxItem(false)]
          // 若要允許使用 ASP.NET AJAX 從腳本中調(diào)用此 Web 服務(wù),請取消注釋以下行。 
          // [System.Web.Script.Services.ScriptService]
          public class MySimpleService : System.Web.Services.WebService
          {
      
              [WebMethod]
              public string GetSumString(int para1, int para2)
              {
                  int result = para1 + para2;
                  return result.ToString();
              }
      
          }
      View Code

      Luckily,WebService和WebMethod為我們提供了完全包裝好的SOAP處理功能,而在大多數(shù)情況下,我們所要做的就是繼承和使用它們。

        (2)創(chuàng)建自定義的類型來處理對asmx文件的請求

        在ASP.NET的處理機制中,所有的HTTP請求通道都通過管道來尋找處理程序。我們所熟悉的WebForm和WebService,都是實現(xiàn)了IHttpHandler接口的Http處理程序,這導(dǎo)致了它們有能力處理特定的Http請求。事實上,我們可以通過配置Web.config來自定義Http處理程序和資源的映射匹配關(guān)系,如同下面的配置所展示的一樣:

      <httpHandlers>
            <add verb="*" path="*.ashx" type="System.Web.UI.SimpleHandlerFactory"/>
            <add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/>
            <add verb="*" path="*.asmx" type="System.Web.Services.Protoclos.WebServiceHandlerFactory"/>
      </httpHandlers>

        實現(xiàn)IHttpHandler接口很簡單,必須的工作就僅僅是實現(xiàn)一個ProcessRequest方法和一個只讀屬性:

          public void ProcessRequest(HttpContext context)
          public bool IsReusable

        在HttpContext類型的上下文對象中包含了Http請求(HttpRequest),也包含了Http返回類型對象(HttpResponse),并且允許程序員往里面寫入希望的返回內(nèi)容。IsReusable屬性則返回當(dāng)前對象是否可被重用來應(yīng)對所有類似的Http請求。

        鑒于此,我們可以自己實現(xiàn)一個實現(xiàn)IHttpHandler接口的處理程序,在配置文件中將其綁定到.asmx文件上,就可以實現(xiàn)Web Service方法了。當(dāng)然,為了符合SOAP規(guī)范,我們需要在ProcessRequest方法中解析SOAP請求,并且把返回值放入一個SOAP包中。

        下面的代碼示例展示了如何自定義asmx處理程序(這里只展示了如何編寫實現(xiàn)IHttpHandler接口的類型并使其工作,省略了繁瑣的SOAP解析和組織工作)

        ① 新建一個ashx程序,實現(xiàn)IHttpHandler接口

          /// <summary>
          /// MySimpleHandler 的摘要說明
          /// </summary>
          public class MySimpleHandler : IHttpHandler
          {
      
              public void ProcessRequest(HttpContext context)
              {
                  context.Response.Write("<h1>Hello Web Service!</h1>");
              }
      
              public bool IsReusable
              {
                  get
                  {
                      return true;
                  }
              }
          }
      View Code

        ② 修改Web.config文件,加入自定義HttpHandler類型

       <add verb="*" path="*.asmx" type="MyWebApp.MySimpleHandler,MyWebApp"/>

        (3)自定義Web Service資源文件和處理程序

        事實上,我們完全可以定義一種新的資源文件而不是采用asmx文件名,只要我們?yōu)槠涠ㄖ艸ttpHandler程序。需要做的工作為:

        ① 定義一個新的文件格式如asnew,在IIS中匹配asnew和aspnet_isapi.dll處理程序;

        ② 自定義一個實現(xiàn)了IHttpHandler接口的類型,在這個類型中實現(xiàn)SOAP;

        ③ 在需要使用asnew文件的站點配置文件中綁定asnew和新的Http處理類型;

        這樣的方案顯然可以為系統(tǒng)帶來更大的靈活性,但同時也意味著更大的代碼量。下圖展示了三種實現(xiàn)Web Service的方法之間的關(guān)系:

      2.2 WebMethod特性包含哪些屬性,各有神馬用處?

        WebMethod特性在Web Service中被用來申明一個公開方法,了解其使用方法是在正確編寫Web Service的基礎(chǔ)。在WebMethod特性中,一共包含了6個屬性,這6個屬性對WebMethod的使用非常重要。

        (1)BufferResponse屬性

        該屬性表明是否啟用對Web Service方法響應(yīng)的緩沖。當(dāng)設(shè)置為true時,Web Service方法將響應(yīng)序列化到內(nèi)存緩沖區(qū)中,直到緩存區(qū)被用滿或者響應(yīng)結(jié)束后,響應(yīng)才會被發(fā)送給客戶端。相反,設(shè)置為false時,.NET默認(rèn)以16KB的塊區(qū)緩沖響應(yīng),響應(yīng)在被序列化的同時將會被不斷發(fā)送給客戶端,無論該響應(yīng)是否已經(jīng)完全結(jié)束。

      PS:默認(rèn)BufferResponse被設(shè)置為true。當(dāng)Web Service要發(fā)送大量數(shù)據(jù)流給客戶端時,設(shè)置BufferResponse為false時可以防止大規(guī)模數(shù)據(jù)一次性刷新到內(nèi)存,而對于小量數(shù)據(jù),設(shè)置為true則可以有效地提高性能。

        (2)EnableSession屬性

        該屬性指定是否啟用會話狀態(tài)。如果為true,則啟用,為fasle則禁用。默認(rèn)被設(shè)置為false。

          public class MySimpleService : System.Web.Services.WebService
          {
              [WebMethod(EnableSession = true)]
              public string WithSession()
              {
                  return TryGetSession();
              }
      
              [WebMethod(EnableSession = false)]
              public string WithoutSession()
              {
                  return TryGetSession();
              }
      
              private string TryGetSession()
              {
                  if (Session == null)
                  {
                      return "Session is Forbidden";
                  }
      
                  if (Session["number"] == null)
                  {
                      Session["number"] = 0;
                  }
      
                  Session["number"] = (int)Session["number"] + 1;
                  return Session["number"].ToString();
              }
          }
      View Code

        分別訪問WithSession和WithoutSession方法,結(jié)果如下圖所示:

        (3)CacheDuration屬性

        該屬性指示啟用對Web Service方法結(jié)果的緩存。服務(wù)端將會緩存每個唯一參數(shù)集的結(jié)果,該屬性的值指定服務(wù)器端應(yīng)該對結(jié)果進行多少秒的緩存處理。如果該值為0,則禁用對結(jié)果進行緩存;如果不為零,則啟用緩存,單位為秒,意為設(shè)置多少秒的緩存時間。默認(rèn)該值被設(shè)為0。

          [WebMethod(CacheDuration = 10, EnableSession = true)]
          public string WithCache()
          {
              if (Session["number"] == null)
              {
                  Session["number"] = 0;
              }
      
              Session["number"] = (int)Session["number"] + 1;
              return Session["number"].ToString();
          }
      View Code

        上面的WithCache方法設(shè)置了10秒的緩存時間,即10秒內(nèi)的訪問都會得到一樣的結(jié)果。

        (4)Description屬性

        該屬性很簡單,提供了對某個Web Service方法的說明,并且會顯示在服務(wù)幫助頁上面。

        (5)MessageName屬性

        該屬性是Web Service能夠唯一確定使用別名的重載方法。除非另外指定,默認(rèn)值是方法名稱。當(dāng)指定MessageName時,結(jié)果SOAP消息將反映該名稱,而不是實際的方法名稱。

        當(dāng)Web Service提供了兩個同名的方法時,MessageName屬性會很有用,這一點將會體現(xiàn)在WSDL中:

          [WebMethod(MessageName="HelloWorld1")]
          public string HelloWorld(int num)
          {
              return num.ToString();
          }
      
          [WebMethod(MessageName = "HelloWorld2")]
          public string HelloWorld()
          {
              return "Hello World!";
          }
      View Code

        (6)TransactionOption屬性

        該屬性用以設(shè)置Web Service方法的事務(wù)特性,在.NET中事務(wù)模型是基于聲明性的,而不是編寫特定的代碼來處理提交和回滾事務(wù)。在Web Service中,可以通過TransactionOption屬性來設(shè)置該方法是否需要被放入一個事務(wù)之中。如果申明了事務(wù)屬性,執(zhí)行Web Service方法時引發(fā)異常會自動終止事務(wù),相反如果未發(fā)生任何異常,則自動提交事務(wù)。

        事務(wù)最常用的一個場景就是數(shù)據(jù)庫訪問,所以該屬性在利用Web Service實現(xiàn)的分布式數(shù)據(jù)庫訪問中就特別有用。

      2.2 如何生成Web Service代理類型?

        (1)Web Service代理類的概念

        所謂的代理類,就是SOAP協(xié)議的代理類型,它使得我們可以通過調(diào)用本地的類型方法(代理類),來達(dá)到訪問Web Service方法的目的。代理類的最終目的就是將程序員從繁瑣的SOAP消息處理和XML解析中解放出來,而專注于邏輯工作。下圖說明了代理類的作用:

        (2)如何生成Web Service代理類

        在Visual Studio中提供了一個很簡單的生成Web Service代理類的方法就是Web引用,如下圖所示:

        當(dāng)Web引用被添加后,一個代理類型也會自動生成。并且,當(dāng)服務(wù)端的Web Service更新后,我們只需要簡單地更新一下Web引用,就可以方便地更新代理類型。

        在客戶端邏輯中,只需要調(diào)用代理類的對應(yīng)接口就OK,十分簡單:

          class Program
          {
              static void Main(string[] args)
              {
                  using (MySimpleServiceSoapClient proxy = new MySimpleServiceSoapClient())
                  {
                      string result = proxy.GetSumString(250, 250);
                      Console.WriteLine("250+250={0}", result);
                  }
                  Console.ReadKey();
              }
          }
      View Code

        執(zhí)行結(jié)果為:

        

      2.3 簡述.NET中Web Service的異常機制

        即使有了本地的代理類,調(diào)用Web Service方法還是調(diào)用本地方法有所區(qū)別,如果Web Service出現(xiàn)了異常,那么這些異常信息就需要被封裝在SOAP信息中發(fā)送回客戶端。

        (1)SOAP中對異常的規(guī)定

        SOAP規(guī)定了異常信息的攜帶方式,那就是全被放入fault節(jié)點中。fault節(jié)點必須是Body節(jié)點的子節(jié)點,而且一個SOAP消息只能出現(xiàn)一個fault節(jié)點。

      子節(jié)點 描述
      <faultcode> 識別故障的代碼
      <faultstring> 供認(rèn)閱讀的有關(guān)故障的說明
      <faultactor> 是誰引發(fā)異常
      <detail> 存留設(shè)計Body元素的應(yīng)用程序?qū)S缅e誤信息

        其中faultcode是一個錯誤碼,其取值和每個值所代表的含義都在SOAP中有所定義,下表列出了所有faultcode及其含義:

      faultcode節(jié)點值 描述
      VersionMismatch SOAP Envelop元素的無效命名空間被發(fā)現(xiàn)
      MustUnderstand Header元素的一個直接子元素?zé)o法被理解
      Client 消息被不正確地構(gòu)成,或包含了不正確的信息
      Server 服務(wù)器有問題,因此無法處理進行下去

        (2)服務(wù)端對未捕獲異常的處理

        在使用WebService類型和WebMethod特性創(chuàng)建Web Service的情況下,服務(wù)器端的異常都會被捕捉,并且所有異常都會被放入到SoapException類型中,并且返回給客戶端。我們可以在服務(wù)端代碼中直接使用SoapException異常,通過設(shè)置其屬性來告知客戶端:

        ① Message:原始異常的Message屬性

        ② Code:服務(wù)器異常碼

        ③ Actor:Web Service方法的URL

        ④ Detail:空引用,但有一個空的詳細(xì)信息元素存在于故障元素之中

        服務(wù)端會把SoapException放入Fault節(jié)點之中并返回給客戶端,以此來告知服務(wù)端發(fā)生的異常。

        (3)客戶端代理類對fault節(jié)點的處理

        如果使用.NET自動生成的Web Service代理類,那么它將能夠自動地識別fault節(jié)點,并且還原為SoapException異常。這里可以通過下面的一段代碼示例來直觀地了解這一點:

        ① 首先在Web Service方法中直接拋出一個異常,如下代碼所示:

          [WebMethod]
          public string HelloException()
          {
              // 直接拋出一個異常,該異常會被包裝為SoapException
              throw new Exception("發(fā)生了一個異常!");
          }
      View Code

        ② 其次根據(jù)這個Web Service在本地生成對應(yīng)代理類,并且通過try-catch捕捉從服務(wù)端發(fā)送來的SoapExcetpion:

          class ServiceClient
          {
              static void Main(string[] args)
              {
                  using (MySimpleServiceSoapClient proxy = new MySimpleServiceSoapClient())
                  {
                      try
                      {
                          // 這里異常將會被代理類拋出
                          proxy.HelloException();
                      }
                      catch (SoapException ex)
                      {
                          // 打印異常信息內(nèi)容
                          Console.WriteLine("Actor:{0}", ex.Actor);
                          Console.WriteLine("CodeName:{0}", ex.Code.Name);
                          Console.WriteLine("Detail:{0}", ex.Detail.InnerText);
                          Console.WriteLine("Message:{0}", ex.Message);
                      }
                  }
                  Console.ReadKey();
              }
          }
      View Code

      參考資料

      (1)朱毅,《進入IT企業(yè)必讀的200個.NET面試題》

      (2)張子陽,《.NET之美:.NET關(guān)鍵技術(shù)深入解析》

      (3)王濤,《你必須知道的.NET》

       

      posted @ 2015-10-02 22:36  EdisonZhou  閱讀(9029)  評論(4)    收藏  舉報
      主站蜘蛛池模板: 在线观看中文字幕码国产| 性做久久久久久久| 一区二区三区国产偷拍| 国产精品免费第一区二区| 亚洲国产精品午夜福利| 国产在线午夜不卡精品影院| 精品精品亚洲高清a毛片| 成人午夜视频在线| 免费AV片在线观看网址| 麻豆精品一区二区视频在线| 亚洲亚洲人成综合网络| 国产超碰无码最新上传| 影音先锋人妻啪啪av资源网站| 亚洲午夜无码久久久久小说| 久久婷婷成人综合色| 日本高清久久一区二区三区| 博客| 国产一区二区三区精品综合| 国产伦码精品一区二区| 中文字幕在线精品国产| 爆乳日韩尤物无码一区| 天天摸天天操免费播放小视频| 国产偷人妻精品一区二区在线 | 国内自拍网红在线综合一区| 免费观看在线A级毛片| 国产精品亚洲аv无码播放| 免费人成再在线观看视频| 国产无遮挡真人免费视频| 免青青草免费观看视频在线| 日本精品极品视频在线| 99久久精品久久久久久婷婷| 国产成人综合95精品视频| 美姑县| 亚洲宅男精品一区在线观看| 国产三级精品三级在线看| 中文字幕乱码一区二区免费| 天天狠天天透天天伊人| 久久婷婷综合色丁香五月| 欧美黑人又粗又大又爽免费| 夜色福利站WWW国产在线视频| 牡丹江市|