[英]Catch Custom Exception from ASMX Web Service
我有一個Web服務,我在其中創建了一個自定義異常。 假設此異常的名稱是InvalidContractException。
我想要做的是,如果發生特定步驟,我想拋出此異常。 但是,我無法弄清楚客戶端如何捕獲InvalidContractException以便正確處理它。
這是一個用C#編寫的ASP.Net Web服務
你不能這樣做:
ASMX Web服務沒有對SOAP Faults的適當支持。 除了客戶端的SoapException之外,沒有辦法獲得任何異常。
升級到WCF的另一個原因。
作為ASMX 無法做到的一個例子,這里是WCF的工作原理。 WCF允許您為每個Web服務操作指定它可以返回哪些錯誤:
[ServiceContract]
public interface IMyServiceContract
{
[FaultContract(typeof(IntegerZeroFault))]
[FaultContract(typeof(SomeOtherFault))]
[OperationContract]
public string GetSomeString(int someInteger);
}
[DataContract]
public class IntegerZeroFault
{
[DataMember]
public string WhichInteger {get;set;}
}
[DataContract]
public class SomeOtherFault
{
[DataMember]
public string ErrorMessage {get;set;}
}
public class MyService : IMyServiceContract
{
public string GetSomeString(int someInteger)
{
if (someInteger == 0)
throw new FaultException<IntegerZeroFault>(
new IntegerZeroFault{WhichInteger="someInteger"});
if (someInteger != 42)
throw new FaultException<SomeOtherFault>(
new SomeOtherFault{ErrorMessage ="That's not the anaswer"});
return "Don't panic";
}
}
然后,WCF客戶端可以捕獲FaultException<SomeOtherFault>
。 當我嘗試使用Java客戶端時,它能夠捕獲SomeOtherFault
,IBM Rational Web Developer創建它來自Java Exception
類。
如果您的目標是拋出異常,以便用戶可以知道出現了問題,發生了一些特定的異常並對其進行了特殊處理,那么您確實有一個選項。 您只需要依賴客戶端代理的正確實現(實際上,一個選項是自己提供客戶端代理)。
有一個有用的文章速效這里了解如何SoapException
的工作。
本質上,它歸結為在SoapException
的詳細信息節點中編碼異常詳細信息(例如,錯誤代碼),然后在重新拋出異常之前在客戶端解析它。
沒有辦法重新創建異常就像它被拋出服務邊界一樣,除了客戶端的SoapException之外,沒有任何自動方法可以獲取任何東西。
在您的客戶端調用拋出Fault的WCF服務時,您可以
試試..
將錯誤捕獲為FaultException(Of YourService.FooBarFault)
結束嘗試
您必須為可能生成錯誤的服務方法聲明FaultContract,例如
_
<FaultContract(GetType(FooBarFault))> _
Function yourCall
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.