wcf其他參考異步異常和錯(cuò)誤處理msmq_第1頁(yè)
wcf其他參考異步異常和錯(cuò)誤處理msmq_第2頁(yè)
wcf其他參考異步異常和錯(cuò)誤處理msmq_第3頁(yè)
wcf其他參考異步異常和錯(cuò)誤處理msmq_第4頁(yè)
wcf其他參考異步異常和錯(cuò)誤處理msmq_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、wcf 其他參考(異步異常和錯(cuò)誤處理msmq)異步是否是異步由客戶端決定,實(shí)現(xiàn)異步也相對(duì)簡(jiǎn)單,我們用svcutil 來(lái)生成客戶端代理代碼的時(shí)候 ,只需添加 /async 便可 就是在添加 ServiceReference 的時(shí)候 ,選擇高級(jí)選項(xiàng) ,鉤選以生成有異步功能的代理類了 .而在 IDE中 ,操作就更加簡(jiǎn)單 ,Generate Asynchronus op erations,如圖:生成異步操作的代理類下就會(huì)增加 BeginXXX 和 EndXXX 方 法。比如我們示例項(xiàng)目中服務(wù)契約中有OperationContract string GetData(int value);的操作方法,生成

2、的代理類中對(duì)應(yīng)其的異步方法為:System.ServiceModel.OperationContractAttribute(AsyncPatter n=true, Action="/IService1/GetData",ReplyAction="/IService1/GetDataResponse")System.IAsyncResult BeginGetData(int value,System.AsyncCallback callback, object asyncState);st

3、ring EndGetData(System.IAsyncResult result);另外,由于回調(diào)方法并非運(yùn)行在主線程中。如果回調(diào)方法需要更新與異步調(diào)用結(jié)果相關(guān)的界面。我們可以使用SynchronizationContext 以及它的 SendOrPostCallback 委托, 對(duì)調(diào)用進(jìn)行封送:public ExplorerClientForm()InitializeComponent();m_synchronizationContext =SynchronizationContext.Current;private SynchronizationContext m_synchroniz

4、ationContext;則回調(diào)方法修改為:/callback method void OnTransferCompleted(IAsyncResult result)Stream stream = m_service.EndTransferDocument(result);result.AsyncWaitHandle.Close();SendOrPostCallback callback = delegatelbMessage.Text = string.Format("The file 0 hadbeen transfered sucessfully.",m_doc.F

5、ileName);m_synchronizationContext.Send(callback,null);或者使用主窗體 / 控件的 Invoke 方法:/異步返回時(shí)候的事件 /也可以直接調(diào)用,不用通過(guò)事件 void udpUtil_MesEvent(MesEventArgs e)this.Invoke(mesEventHandler, e);mesEventHandler = newMesEventHandler(communnicateFromHandle);private void communnicateFromHandle(MesEventArgs meg)IMUtil.mesTy

6、pe(meg);void CallBack(IAsyncResult ar)Service.IService1 ws= ar.AsyncState asService.Service1Client;string res = ws.EndGetData(ar);MessageBox.Show(res);MethodInvoker mi = new MethodInvoker(Compelete);button3.Invoke(mi);void Compelete()button3.Enabled = true;WCF 中的異步調(diào)用WCF 從理論到實(shí)踐 (11)-異步二 錯(cuò)誤和異常處理 缺省模式下

7、, 服務(wù)端發(fā)生異常, 客戶端會(huì)獲得一個(gè) Exception , 但是這個(gè) Exception 并不包括詳細(xì)的異常信息,因?yàn)榉?wù)端 并不能完全信賴客戶端, 比如瀏覽器和 Web服務(wù)器之間。為了防止非法的客戶端從異常消息中獲服務(wù)端的比較詳細(xì)的 信息,所以服務(wù)對(duì)于異常通常會(huì)比較模糊。在進(jìn)行 WCF 分布式應(yīng)用開(kāi)發(fā)的過(guò)程中,我們客戶端經(jīng)常會(huì)遇到一下三種常見(jiàn)的錯(cuò)誤。1):通信錯(cuò)誤,可能和網(wǎng)絡(luò)、通道等相關(guān)的異常,客戶端表現(xiàn)為 Communication Exception ;(2):代理和通道的 State,代理已經(jīng)關(guān)閉,或者通道Fault,等問(wèn)題,這個(gè)比較常見(jiàn)。一般通道閑置時(shí)間過(guò)久,通道會(huì)出現(xiàn)這個(gè)狀態(tài)錯(cuò)

8、誤的問(wèn)題。一般我們可以通過(guò)代理的State來(lái)判斷。安全驗(yàn)證失敗也會(huì)導(dǎo)致這個(gè)錯(cuò)誤。3):服務(wù)調(diào)用錯(cuò)誤,服務(wù)調(diào)用時(shí)拋出的異常,這個(gè)服務(wù)內(nèi)部異常會(huì)序列化傳遞給客戶端,被客戶端捕獲。PerSession這種模式下,拋出異常,服務(wù)實(shí)例將銷毀,客戶端拋出 FaultException ,客戶端代理對(duì)象無(wú)法繼續(xù)使用PerCall:這種模式下,拋出異常,服務(wù)實(shí)例也將銷毀。客戶端代理對(duì)象無(wú)法繼續(xù)使用Single:這種模式下,拋出異常,服務(wù)實(shí)例會(huì)照舊運(yùn)行??蛻舳舜頍o(wú)法繼續(xù)使用。FaultException因此如果在 WCF 服務(wù)中采用傳統(tǒng)的方式處理異常,由于 異常消息不能被序列化,因而客戶端無(wú)法捕獲和處理服務(wù)拋

9、 出的異常。 為了解決這個(gè)問(wèn)題, WCF 提供了 FaultException 。這個(gè)是一個(gè)基于行業(yè)標(biāo)準(zhǔn)的 SOAP 異常類, WCF 會(huì)將無(wú)法可以把錯(cuò)誤信息傳遞到客戶端,客戶端可以捕獲FaultException 或者 Exception 。比如:Catch(FaultException ex)但是,這種情況下,比如服務(wù)端是DirectoryNotFoundException ,這種情況下下卻無(wú)法識(shí)別DirectoryNotFoundException 所傳遞的錯(cuò)誤信息。 尤為嚴(yán)重的 是這樣的異常處理方式還會(huì)導(dǎo)致傳遞消息的通道出現(xiàn)錯(cuò)誤, 當(dāng)客戶端繼續(xù)調(diào)用該服務(wù)代理對(duì)象的服務(wù)操作時(shí),會(huì)獲得 個(gè)

10、 CommunicationObjectFaultedException 異常,無(wú)法繼續(xù)使用服務(wù)。如果服務(wù)被設(shè)置為PerSession模式或者Single模式,異常還會(huì)導(dǎo)致服務(wù)對(duì)象被釋放,終止服務(wù)FaultException 的另外一個(gè)重要的泛型定義就是FaultException<T>, 這里我們可以使用任何系統(tǒng)類型或 者自定義類型來(lái)傳遞錯(cuò)誤信息, T 代表要傳遞的錯(cuò)誤細(xì)節(jié)。FaultContractWCF 為異常處理專門提供了 FaultContract 特性,它可以被應(yīng) 用到服務(wù)操作上,指明操作可能會(huì)拋出的異常類型。我們可以將服務(wù)所要拋出的異常類型作為Faul

11、tException<T> 的類型參數(shù),然后創(chuàng)建一個(gè)FaultReason 對(duì)象用以傳遞錯(cuò)誤消息。 客戶端在調(diào)用服務(wù)代理 對(duì)象時(shí),可以捕獲 FaultException<DirectoryNotFoundException> 異常,并且該異常不會(huì)使得 通道發(fā)生錯(cuò)誤,并且客戶端可以繼續(xù)使用該服務(wù)代理對(duì)象。即使服務(wù)為 PerCall 服務(wù),客戶端仍然可以繼續(xù)調(diào)用服務(wù)操 作。如果服務(wù)為 Session 服務(wù)或 Singleton 服務(wù),那么即使發(fā) 生了異常,服務(wù)對(duì)象也不會(huì)被終結(jié)。DirectoryNotFoundException except

12、ion = newDirectoryNotFoundException();throw newFaultException<DirectoryNotFoundException>(exception new FaultReason(string.Format("Directory 0 is not found.", homeDir);includeExceptionDetailInFaults只是為了讓客戶端獲得異常消息,即使不施加 FaultContract特性,或者拋出非 FaultException 異常,我們也可以通過(guò)ServiceBeh

13、avior 特性,將服務(wù)的IncludeExceptionDetailInFaults 設(shè)置為 true (默認(rèn)為 false),此時(shí),客戶端可以捕獲拋出的非 FaultException 異常信息, 但該異常仍然會(huì)導(dǎo)致通道出現(xiàn)錯(cuò)誤在發(fā)布服務(wù)與部署服務(wù)時(shí),我們應(yīng)避免將服務(wù)的IncludeExceptionDetailInFaults 設(shè)置為 true。WCF 異常處理擴(kuò)展WCF 允許開(kāi)發(fā)者定制異常報(bào)告和異常傳遞的過(guò)程。 但是要實(shí) 現(xiàn) System.ServiceModel.Dispatcher.IErrorHandler 接口:IErrorHandler 的定義如下:public interf

14、ace IErrorHandler/ Methods bool HandleError(Exception error);void ProvideFault(Exception error, MessageVersionversion, ref Message fault);服務(wù)端拋出的異常會(huì)再調(diào)用 ProvideFault() 方法后再返回給 客戶端。 ProvideFault 不考慮異常的類型。Promotion另外 ProvideFault 一個(gè)重要的作用,異常提升( Exception)。它可以將非 FaultContract 異常提升為FaultContract<T&a

15、mp;gt; 異常,例如將 OverflowException 異常 提升為 FaultExceptino< OverflowException> 異常。例如將 DirectoryNotFoundException 異常提升為FaultExceptino<DirectoryNotFoundException> 異常:public void ProvideFault(Exception error, MessageVersion version, ref Message fault)if (error is DirectoryNotFoun

16、dException)FaultException<DirectoryNotFoundException>faultException = newFaultException<DirectoryNotFoundException>(new DirectoryNotFoundException(), newFaultReason(error.Message);MessageFault messageFault =faultException.CreateMessageFault();fault =Message.CreateMessage(

17、version,messageFault,faultException.A ction);而 HandleError() 方法,我們可以重新實(shí)現(xiàn)代碼,如 log 日志。要使得錯(cuò)誤處理擴(kuò)展生效,還需要向服務(wù)通道安裝錯(cuò)誤處 理擴(kuò)展。方法是讓服務(wù)類實(shí)現(xiàn)System.ServiceModel.Description.IServiceBehavior 接口:public class DocumentsExplorerService :IDocumentsExplorerService,IErrorHandler,IServiceBehavior,ID isposable … 然后在

18、ApplyDispatchBehavior() 方法中安裝錯(cuò)誤 處理擴(kuò)展:public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)foreach (ChannelDispatcher dispatcher inserviceHostBase.ChannelDispatchersdispatcher.ErrorHandlers.Add(this);通過(guò)這樣的處理,即使服務(wù)拋出的異常為DirectoryNotFoundException 異常,并且在服

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論