偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

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

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

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

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

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

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

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

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

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

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

 

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

 

如果想傳遞一個(gè)附帶元數(shù)據(jù)的自定義詳細(xì)信息,可以使用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)然,我們也可以直接拋出一個(gè)被稱之為 "Unknown Faults" 的 FaultException 異常實(shí)例。還有另外一種情況,你已經(jīng)寫好了代碼,有很多……很多……的代碼,要是一個(gè)個(gè)修改會(huì)非常……非常……麻煩,那么怎么在不做大的代碼修改情況下傳遞詳細(xì)異常信息給客戶端呢?

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

這個(gè)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:行號(hào) 60

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

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

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

 

  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é)任編輯:曹凱 來(lái)源: 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文件

2017-06-01 11:17:57

Python異常重試解決方案

2018-09-14 16:20:37

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-21 10:27:52

WCF基本概念

2010-03-02 16:09:53

WCF框架

2009-12-29 16:07:19

ADO類型

2009-11-05 12:45:25

WCF異常

2009-10-15 10:29:03

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

2020-09-04 13:50:35

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

2009-11-09 10:10:13

WCF異常

2009-12-07 18:38:16

WCF異常
點(diǎn)贊
收藏

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