• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • Web服務中的異常處理(3)

    發表于:2007-05-25來源:作者:點擊數: 標簽:
    既然我們已經了解了AddCategories方法,現在就讓我們來看看AddCategories方法所用到的助手方法。首先,我們看看ValidateXml方法。像前面所提到的那樣,該方法負責確保被添加的CategoriesXML數據遵從Categories.xsd中所預先定義好的XML模式。 privateboolVali
    既然我們已經了解了AddCategories方法,現在就讓我們來看看AddCategories方法所用到的助手方法。首先,我們看看ValidateXml方法。像前面所提到的那樣,該方法負責確保被添加的CategoriesXML數據遵從Categories.xsd中所預先定義好的XML模式。

      privateboolValidateXml(stringxml)

      {

      boolvalidXml=false;
      
      //LoadtheXMLdataintomemory
      
      XmlValidatingReadervalReader=new
      
      XmlValidatingReader(xml,XmlNodeType.Document,null);
      
      valReader.Schemas.Add(null,Server.MapPath("Categories.xsd"));
      
      valReader.ValidationType=ValidationType.Schema;
      
      valReader.ValidationEventHandler+=new
      
      ValidationEventHandler(ValidationHandler);

      //LoopthroughtheXMLfile
      
      while(valReader.Read())
      
      {}
      
      if(builder.Length>0)
      
      validXml=false;
      
      else
      
      validXml=true;
      
      valReader.Close();
      
      returnvalidXml;
      
      }


      以上代碼首先把被添加的XML數據傳遞給構造函數,創建一個XmlValidatingReader類實例。然后,把Categories.xsd添加到XmlValidatingReader對象的Schemas集合中。接著,設置ValidationType為ValidationType.Schema,表明我們是在根據XML模式來驗證XML數據。當你在使用XmlValidatingReader類驗證XML數據時,你必須創建一個事件處理對象,并把它與ValidationEventHandler事件相關聯。一旦做完這些后,校驗錯誤和警告就通過這個回調事件處理對象被報告出來。ValidationEventHandler具有一個ValidationEventArgs類型的參數。ValidationEventArgs類提供兩個重要屬性,Message和Serverity。這兩個屬性提供更多的有關于校驗錯誤的信息。
      
      在這種情況下,我們把ValidationEventHandler事件與ValidationHandler方法相關聯。在這個方法中,我們附加錯誤信息到StringBuilder對象中,而該StringBuilder對象定義在模塊中。如果沒有任何校驗錯誤,那么StringBuilder對象的Length屬性將返回0。我們就是使用這個來檢查XML模式校驗是否失敗。ValidationHandler方法定義如下。
      
      publicvoidValidationHandler(objectsender,
      
      ValidationEventArgsargs)
      
      {
      
      builder.Append("Validationerror"+"
    ");
      
      builder.Append("Severity:"+args.Severity+"
    ");
      
      builder.Append("Message:"+args.Message+"
    ");
      
      }
       
      下面,讓我們來看看RaiseException方法的代碼。

      publicSoapExceptionRaiseException(stringuri,
      
      stringwebServiceNamespace,
      
      stringerrorMessage,
      
      stringerrorNumber,
      
      stringerrorSource,
      
      FaultCodecode)
      
      {
      
      XmlQualifiedNamefaultCodeLocation=null;
      
      //IdentifythelocationoftheFaultCode
      
      switch(code)
      
      {
      
      caseFaultCode.Client:
      
      faultCodeLocation=SoapException.ClientFaultCode;
      
      break;
      
      caseFaultCode.Server:
      
      faultCodeLocation=SoapException.ServerFaultCode;
      
      break;
      
      }

      XmlDocumentxmlDoc=newXmlDocument();
      
      //CreatetheDetailnode
      
      XmlNoderootNode=xmlDoc.CreateNode(XmlNodeType.Element,
      
      SoapException.DetailElementName.Name,
      
      SoapException.DetailElementName.Namespace);
      
      //BuildspecificdetailsfortheSoapException
      
      //AddfirstchildofdetailXMLelement.
      
      XmlNodeerrorNode=xmlDoc.CreateNode(XmlNodeType.Element,"Error",
      
      webServiceNamespace);
      
      //CreateandsetthevaluefortheErrorNumbernode
      
      XmlNodeerrorNumberNode=
      
      xmlDoc.CreateNode(XmlNodeType.Element,"ErrorNumber",
      
      webServiceNamespace);
      
      errorNumberNode.InnerText=errorNumber;
      
      //CreateandsetthevaluefortheErrorMessagenode
      
      XmlNodeerrorMessageNode=xmlDoc.CreateNode(XmlNodeType.Element,
      
      "ErrorMessage",
      
      webServiceNamespace);
      
      errorMessageNode.InnerText=errorMessage;
      
      //CreateandsetthevaluefortheErrorSourcenode
      
      XmlNodeerrorSourceNode=
      
      xmlDoc.CreateNode(XmlNodeType.Element,"ErrorSource",
      
      webServiceNamespace);
      
      errorSourceNode.InnerText=errorSource;

      //AppendtheErrorchildelementnodestotherootdetailnode.
      
      errorNode.AppendChild(errorNumberNode);
      
      errorNode.AppendChild(errorMessageNode);
      
      errorNode.AppendChild(errorSourceNode);
      
      //AppendtheDetailnodetotherootnode
      
      rootNode.AppendChild(errorNode);
      
      //Constructtheexception
      
      SoapExceptionsoapEx=newSoapException(errorMessage,
      
      faultCodeLocation,uri,

      rootNode);
      
      //Raisetheexceptionbacktothecaller
      
      returnsoapEx;
      
      }

     
      正如其名所提示的那樣,RaiseException方法用于以SoapException對象的形式拋出Web服務中的異常。上面所示代碼首先檢查包含在FaultCode中的枚舉參數的值,而該枚舉參數用來標識異常發生的源頭。如果是因為服務器端的問題(例如,數據庫服務器已經關閉)而發生異常,那么應該設置FaultCode的值為SoapException.ServerFaultCode。接著,RaiseException方法創建一個XmlDocument對象來保存detail元素的內容。該對象添加detail元素下的所有子元素,然后把detail節點傳遞給SoapException對象的構造函數。最后,方法用return語句把SoapException對象返回給調用者。如果你檢查SoapException對象內部的detail元素,你會發現它與下面內容有點類似。

      
      
      
      
      1000
      
      ExceptionInformation
      
      ExceptionSource
      
      

      


      當客戶應用程序接收到Web服務的異常時,它可以查看SoapException對象的Detail屬性以獲取更多的有關于已產生的異常的信息。

      使用SoapException的優點:

      使用SoapException類把異常信息返回給Web服務的客戶端,這種方法具有很多的優點。如下:

      能夠以一致的方式來處理異常情況

      基于SOAP規范
      
      通過顯示的產生異常,這可以傳達更多的信息,例如,異常原因,Web服務方法的URL等等(使用諸如Actor、Code和Detail之類的屬性)
      
      使用FaultCode,可以清楚地表示異常歸因于客戶端還是服務器端
      
      使用Detail屬性,可以更詳細地描述異常信息

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>