自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

WCF調(diào)用服務(wù)異?;窘鉀Q方案介紹

開發(fā) 開發(fā)工具
WCF調(diào)用服務(wù)異常的拋出主要有這樣的三種類型,包括通訊異常;狀態(tài)異常;以及服務(wù)異常。在這里我們將會對此一一介紹。

在應(yīng)用WCF工具進行實際開發(fā)的時候,通常都會遇到一些異常的發(fā)生。那么如何才能正確有效的處理這些異常的產(chǎn)生呢?在這里我們先來一起了解一下WCF調(diào)用服務(wù)異常的相關(guān)解決方法,以幫助大家解決問題。#t#

WCF調(diào)用服務(wù)異常主要包括以下三種類型:

1. 通訊異常。諸如網(wǎng)絡(luò)錯誤,地址錯誤,服務(wù)器沒有啟動等等。這類異常多是 CommunicationException (或其具體繼承類型)。

2. 狀態(tài)異常。比如訪問了已經(jīng)關(guān)閉的代理對象,契約錯誤,以及安全設(shè)置錯誤等。常見的有 ObjectDisposedException。

3. 服務(wù)異常。由服務(wù)器觸發(fā),多是 FaultException。

針對WCF調(diào)用服務(wù)異常,不同的實例管理方式會有不同的策略。

1. Pre-Call: 服務(wù)實例被釋放,客戶端拋出 FaultException,客戶端代理對象無法繼續(xù)使用。

2. Pre-Session: 服務(wù)實例被釋放,會話終止??蛻舳藪伋?FaultException,客戶端代理對象無法繼續(xù)使用。

3. Singleton: 服務(wù)實例依舊運行,會話終止??蛻舳藪伋?FaultException,客戶端代理對象無法繼續(xù)使用。

基于平臺中立和技術(shù)整合的需要,WCF 以標(biāo)準(zhǔn) Soap Faults 方式傳遞異常信息。WCF 提供了 FaultException 和 FaultException<T> 兩個類型來操控 Soap Faults。通過 FaultException<T> 我們可以向客戶端傳遞一個錯誤信息(FaultReason)以及一個附加的詳細信息(Detail)。理論上,這個附加信息是任何可以序列化的對象。

 

  1. throw new FaultException<int>(123, "abc");  
  2. throw new FaultException<Exception>(new Exception("abc")); 

 

如果想傳遞一個附帶元數(shù)據(jù)的自定義詳細信息,可以使用FaultContract。

 

  1. [DataContract]  
  2. public class ExceptionData  
  3. {  
  4. [DataMember]  
  5. public string Message;  
  6. }  
  7. [ServiceContract]  
  8. public interface IService  
  9. {  
  10. [OperationContract]  
  11. [FaultContract(typeof(ExceptionData))]  
  12. void Test();  
  13. }  
  14. public class Service : IService, IDisposable  
  15. {  
  16. public void Test()  
  17. {  
  18. ExceptionData d = new ExceptionData();  
  19. d.Message = "xxxxxx";  
  20. throw new FaultException<ExceptionData>(d, "abc");  
  21. }  
  22. public void Dispose()  
  23. {  
  24. Console.WriteLine("Dispose...");  
  25. }  

 

當(dāng)然,我們也可以直接拋出一個被稱之為 "Unknown Faults" 的 FaultException 異常實例。還有另外一種情況,你已經(jīng)寫好了代碼,有很多……很多……的代碼,要是一個個修改會非常……非常……麻煩,那么怎么在不做大的代碼修改情況下傳遞詳細異常信息給客戶端呢?

WCF調(diào)用服務(wù)異常方法1: ServiceBehavior(IncludeExceptionDetailInFaults=true)]

 

  1. [ServiceBehavior(IncludeExceptionDetailInFaults=true)]  
  2. public class Service : IService, IDisposable  
  3. {  
  4. public void Test()  
  5. {  
  6. throw new Exception("abc");  
  7. }  
  8.  
  9. public void Dispose()  
  10. {  
  11. Console.WriteLine("Dispose...");  
  12. }  

 

方法2: ServiceDebugBehavior

這個WCF調(diào)用服務(wù)異常的處理方法比方法1要更方便一些,我們除了可以寫代碼外,還可以用配置文件。

 

  1. ServiceHost host = new ServiceHost(typeof(Service), 
    new Uri("http://localhost:8080/Service"));  
  2. host.AddServiceEndpoint(typeof(IService), 
    new BasicHttpBinding(), "");  
  3. ServiceDebugBehavior debug = host.Description.Behaviors.
    Find
    <ServiceDebugBehavior>();  
  4. debug.IncludeExceptionDetailInFaults = true;  
  5. host.Open(); 

 

看看這兩種方法拋出的異常是什么樣的。

未處理 System.ServiceModel.FaultException`1

Message="abc"

Source="mscorlib"

StackTrace:

Server stack trace:

在 ConsoleApplication1.localhost.IService.Test()

在 ConsoleApplication1.localhost.ServiceClient.Test() 位置 D:\...\localhost.cs:行號 60

在 ConsoleApplication1.Program.Main(String[] args) 位置 D:\...\Program.cs:行號 62

不錯,除了 Error Message,還有詳細的 stack trace,方便調(diào)試。也正因為這樣,此種方法也不適合在正式項目中使用,作為系統(tǒng)架構(gòu)設(shè)計的一部分,我們應(yīng)該事先設(shè)計好異常處理。

如果服務(wù)方法是 IsOneWay=true,因不接收返回消息,客戶端也就不會觸發(fā)異常了。而 Callback 無非是服務(wù)器和客戶端掉換個身份而已,道理相同。

 

  1. public interface ICallback  
  2. {  
  3. [OperationContract]  
  4. void DoCallback();  
  5. }  
  6. [ServiceContract(CallbackContract=typeof(ICallback))]  
  7. public interface IService  
  8. {  
  9. [OperationContract]  
  10. void Test();  
  11. }  
  12. [ServiceBehavior(ConcurrencyModeConcurrencyMode=
    ConcurrencyMode.Reentrant)]  
  13. public class Service : IService, IDisposable  
  14. {  
  15. public void Test()  
  16. {  
  17. try  
  18. {  
  19. OperationContext.Current.GetCallbackChannel<ICallback>().
    DoCallback();  
  20. }  
  21. catch (FaultException e)  
  22. {  
  23. Console.WriteLine(e);  
  24. }  
  25. }  
  26. public void Dispose()  
  27. {  
  28. Console.WriteLine("Dispose...");  
  29. }  

以上就是我們?yōu)榇蠹医榻B的WCF調(diào)用服務(wù)異常的相關(guān)解決方法。

責(zé)任編輯:曹凱 來源: CSDN
相關(guān)推薦

2010-02-26 15:46:48

Silverlight

2010-02-24 14:05:08

WCF openati

2009-11-06 15:25:25

WCF異常

2010-02-23 14:56:18

WCF Bug

2010-02-22 10:29:11

WCF上傳文件

2010-02-24 09:28:37

WCF安全配置

2009-12-07 15:50:27

WCF文件

2018-09-14 16:20:37

2017-06-01 11:17:57

Python異常重試解決方案

2009-12-22 15:14:33

WCF調(diào)用

2016-03-13 18:06:47

2009-12-08 15:19:58

WCF大數(shù)據(jù)量

2009-12-29 16:07:19

ADO類型

2009-10-15 10:29:03

布線系統(tǒng)解決方案

2010-03-02 16:09:53

WCF框架

2009-12-21 10:27:52

WCF基本概念

2009-11-05 12:45:25

WCF異常

2020-09-04 13:50:35

前端異常監(jiān)控代碼

2009-11-09 10:10:13

WCF異常

2009-03-05 09:12:29

IDC網(wǎng)絡(luò)管理
點贊
收藏

51CTO技術(shù)棧公眾號