日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
WCF調(diào)用服務(wù)異?;窘鉀Q方案介紹

在應(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#

“專業(yè)、務(wù)實(shí)、高效、創(chuàng)新、把客戶的事當(dāng)成自己的事”是我們每一個(gè)人一直以來(lái)堅(jiān)持追求的企業(yè)文化。 成都創(chuàng)新互聯(lián)公司是您可以信賴的網(wǎng)站建設(shè)服務(wù)商、專業(yè)的互聯(lián)網(wǎng)服務(wù)提供商! 專注于成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、軟件開(kāi)發(fā)、設(shè)計(jì)服務(wù)業(yè)務(wù)。我們始終堅(jiān)持以客戶需求為導(dǎo)向,結(jié)合用戶體驗(yàn)與視覺(jué)傳達(dá),提供有針對(duì)性的項(xiàng)目解決方案,提供專業(yè)性的建議,創(chuàng)新互聯(lián)建站將不斷地超越自我,追逐市場(chǎng),引領(lǐng)市場(chǎng)!

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 兩個(gè)類型來(lái)操控 Soap Faults。通過(guò) FaultException 我們可以向客戶端傳遞一個(gè)錯(cuò)誤信息(FaultReason)以及一個(gè)附加的詳細(xì)信息(Detail)。理論上,這個(gè)附加信息是任何可以序列化的對(duì)象。

 
 
 
  1. throw new FaultException(123, "abc");
  2. throw new FaultException(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(d, "abc");
  21. }
  22. public void Dispose()
  23. {
  24. Console.WriteLine("Dispose...");
  25. }
  26. }

當(dāng)然,我們也可以直接拋出一個(gè)被稱之為 "Unknown Faults" 的 FaultException 異常實(shí)例。還有另外一種情況,你已經(jīng)寫好了代碼,有很多……很多……的代碼,要是一個(gè)個(gè)修改會(huì)非?!浅!闊敲丛趺丛诓蛔龃蟮拇a修改情況下傳遞詳細(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. public void Dispose()
  9. {
  10. Console.WriteLine("Dispose...");
  11. }
  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();
  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().
    DoCallback();
  20. }
  21. catch (FaultException e)
  22. {
  23. Console.WriteLine(e);
  24. }
  25. }
  26. public void Dispose()
  27. {
  28. Console.WriteLine("Dispose...");
  29. }
  30. }

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


網(wǎng)站標(biāo)題:WCF調(diào)用服務(wù)異?;窘鉀Q方案介紹
分享網(wǎng)址:http://www.5511xx.com/article/cojdhjj.html