WEB SERVICES異常 - 中國WEB開發者網絡 (http://www.webasp.net) -- 技術教程 (http://www.webasp.net/article/) --- WEB SERVICES異常 (http://www.webasp.net/article/16/15813.htm) |
| -- 作者:未知 -- 發佈日期: 2004-12-28 |
| 當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; } } } http://blog.csdn.net/marshine/archive/2004/03/25/17170.aspx C#:Web Service異常處理的其他文章. |
| webasp.net |