Web Service學習筆記:WEB SERVICES異常

來源:互聯網
上載者:User

當WEB SERVICES引發一個不在內部處理的異常時,異常將被傳送到ASP.NET,來決定如何處理.
通常有兩種:

1)將異常發往HTTP用戶端,ASP.NET將向用戶端返回一條HTTP INTERNAL SERVER ERROR(內部錯誤,錯誤碼是500)訊息,用戶端根據訊息進行處理.

2)將異常發往SOAP用戶端

如果用戶端使用SOAP協議,ASP.NET則先將其作為SOAP錯誤,然後傳回用戶端.使用SOAP代理的用戶端收到一個SOAP錯誤時,其回應程式式與前一種差不多,不同的是SOAP代理引發的是SYSTEM.WEB.SERVICES.PROTOCOLS.SOAPEXCEPTION.,並將SOAPEXCEPTION.CODE的值設定為SOAP錯誤的FAULTCODE欄位(預設是伺服器錯誤)的值,將SOAPEXCEPTION.MESSAGE屬性設定為FAULTSTRIN欄位(預設是表示捕獲異常的堆疊追蹤的字串)的值.

但這種方法的缺點是無論WEB SERVICES拋出何種異常,用戶端都是拋出SOAPEXCEPTION.解決的方法就不允許ASP.NET自動處理未被捕獲的用戶端綁定異常,WEB SERVICES必須捕獲所有應用程式異常,並明確拋一個SOAPEXCEPTIONASP.NET捕獲時將正確地使用SOAPEXCEPTION的CODE和MESSAGE屬性來填充SOA的錯誤的FAULTCODE和FAULTSTRING元素,這樣,你就可以返回自訂錯誤碼,這些代碼向用戶端提供了有意義的錯誤資訊,然後,用戶端就可以捕獲SOAPEXCEPTION,並用SOAPEXCEPTION.CODE屬性提供的錯誤碼來執行適當的處理.不過這還是有缺陷,那就是用戶端的開發人員必須知道怎麼樣處理這些代碼,所以必須將這些資訊放進系統文檔.

自訂的錯誤碼

 

 

public sealed class e1 : ApplicationException
{
public e1(string message):base(message)
{
//描述該錯誤的資訊,不做任何事,依賴於基類
// TODO: Add constructor logic here
//
}
}
public sealed class e2 : ApplicationException
{
public e2(string message):base(message)
{
//描述該錯誤的資訊,不做任何事,依賴於基類
// TODO: Add constructor logic here
//
}
}

 

 

需要注意的是,SOAPEXCEPTION.CODE屬性並非一個字串,而是SYSTEM.XML.XMLQUALIFIEDNAME的一個執行個體,因此必須執行個體化它.如下:

 

 

using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml;
using System;
[WebServiceBinding(ConformanceClaims=WsiClaims.BP10,EmitConformanceClaims = true)]
public class Service : System.Web.Services.WebService 
{
XmlQualifiedName xname;
[WebMethod]
public int causeexception(int num)
{
int n;
try
{
n=num;
if (n == 1)
{
throw new e1("erroe e1 happen");
}
if (n == 2)
{
throw new e2("erroe e2 happen");
}
}
catch(ApplicationException ex)
{
throw GetException(ex);
}

return n;

}
private SoapException GetException(ApplicationException exx)
{

if (exx is e1)
{
xname = new XmlQualifiedName("e1");
}
if (exx is e2)
{
xname = new XmlQualifiedName("e2");
}
return new SoapException(exx.Message, xname);
}

}

 

 

用戶端:

 

private void button1_Click(object sender, EventArgs e)
{
try
{
exception.Service s = new testexception.exception.Service();//執行個體化代理
if (this.radioButton1.Checked)
{
s.causeexception(1);//引發異常
}
if (this.radioButton2.Checked)
{
s.causeexception(2);
}
}
catch (SoapException ex)
{
switch(ex.Code.ToString())//根據SOAPEXCEPTION.CODE的值顯示相應的訊息
{
case "e1":MessageBox.Show("has error e1");
break;
case "e2":MessageBox.Show("has error e2");
break;
}
}

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.