![wcf其他參考異步異常和錯(cuò)誤處理msmq_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/22/443a783c-3652-4651-a788-69ada4f4a1c8/443a783c-3652-4651-a788-69ada4f4a1c81.gif)
![wcf其他參考異步異常和錯(cuò)誤處理msmq_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/22/443a783c-3652-4651-a788-69ada4f4a1c8/443a783c-3652-4651-a788-69ada4f4a1c82.gif)
![wcf其他參考異步異常和錯(cuò)誤處理msmq_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/22/443a783c-3652-4651-a788-69ada4f4a1c8/443a783c-3652-4651-a788-69ada4f4a1c83.gif)
![wcf其他參考異步異常和錯(cuò)誤處理msmq_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/22/443a783c-3652-4651-a788-69ada4f4a1c8/443a783c-3652-4651-a788-69ada4f4a1c84.gif)
![wcf其他參考異步異常和錯(cuò)誤處理msmq_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-1/22/443a783c-3652-4651-a788-69ada4f4a1c8/443a783c-3652-4651-a788-69ada4f4a1c85.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、wcf 其他參考(異步異常和錯(cuò)誤處理msmq)異步是否是異步由客戶端決定,實(shí)現(xiàn)異步也相對簡單,我們用svcutil 來生成客戶端代理代碼的時(shí)候 ,只需添加 /async 便可 就是在添加 ServiceReference 的時(shí)候 ,選擇高級選項(xiàng) ,鉤選以生成有異步功能的代理類了 .而在 IDE中 ,操作就更加簡單 ,Generate Asynchronus op erations,如圖:生成異步操作的代理類下就會(huì)增加 BeginXXX 和 EndXXX 方 法。比如我們示例項(xiàng)目中服務(wù)契約中有OperationContract string GetData(int value);的操作方法,生成
2、的代理類中對應(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 委托, 對調(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)用,不用通過事件 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ù)對于異常通常會(huì)比較模糊。在進(jìn)行 WCF 分布式應(yīng)用開發(fā)的過程中,我們客戶端經(jīng)常會(huì)遇到一下三種常見的錯(cuò)誤。1):通信錯(cuò)誤,可能和網(wǎng)絡(luò)、通道等相關(guān)的異常,客戶端表現(xiàn)為 Communication Exception ;(2):代理和通道的 State,代理已經(jīng)關(guān)閉,或者通道Fault,等問題,這個(gè)比較常見。一般通道閑置時(shí)間過久,通道會(huì)出現(xiàn)這個(gè)狀態(tài)錯(cuò)
8、誤的問題。一般我們可以通過代理的State來判斷。安全驗(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 ,客戶端代理對象無法繼續(xù)使用PerCall:這種模式下,拋出異常,服務(wù)實(shí)例也將銷毀??蛻舳舜韺ο鬅o法繼續(xù)使用Single:這種模式下,拋出異常,服務(wù)實(shí)例會(huì)照舊運(yùn)行??蛻舳舜頍o法繼續(xù)使用。FaultException因此如果在 WCF 服務(wù)中采用傳統(tǒng)的方式處理異常,由于 異常消息不能被序列化,因而客戶端無法捕獲和處理服務(wù)拋
9、 出的異常。 為了解決這個(gè)問題, WCF 提供了 FaultException 。這個(gè)是一個(gè)基于行業(yè)標(biāo)準(zhǔn)的 SOAP 異常類, WCF 會(huì)將無法可以把錯(cuò)誤信息傳遞到客戶端,客戶端可以捕獲FaultException 或者 Exception 。比如:Catch(FaultException ex)但是,這種情況下,比如服務(wù)端是DirectoryNotFoundException ,這種情況下下卻無法識別DirectoryNotFoundException 所傳遞的錯(cuò)誤信息。 尤為嚴(yán)重的 是這樣的異常處理方式還會(huì)導(dǎo)致傳遞消息的通道出現(xiàn)錯(cuò)誤, 當(dāng)客戶端繼續(xù)調(diào)用該服務(wù)代理對象的服務(wù)操作時(shí),會(huì)獲得 個(gè)
10、 CommunicationObjectFaultedException 異常,無法繼續(xù)使用服務(wù)。如果服務(wù)被設(shè)置為PerSession模式或者Single模式,異常還會(huì)導(dǎo)致服務(wù)對象被釋放,終止服務(wù)FaultException 的另外一個(gè)重要的泛型定義就是FaultException<T>, 這里我們可以使用任何系統(tǒng)類型或 者自定義類型來傳遞錯(cuò)誤信息, T 代表要傳遞的錯(cuò)誤細(xì)節(jié)。FaultContractWCF 為異常處理專門提供了 FaultContract 特性,它可以被應(yīng) 用到服務(wù)操作上,指明操作可能會(huì)拋出的異常類型。我們可以將服務(wù)所要拋出的異常類型作為Faul
11、tException<T> 的類型參數(shù),然后創(chuàng)建一個(gè)FaultReason 對象用以傳遞錯(cuò)誤消息。 客戶端在調(diào)用服務(wù)代理 對象時(shí),可以捕獲 FaultException<DirectoryNotFoundException> 異常,并且該異常不會(huì)使得 通道發(fā)生錯(cuò)誤,并且客戶端可以繼續(xù)使用該服務(wù)代理對象。即使服務(wù)為 PerCall 服務(wù),客戶端仍然可以繼續(xù)調(diào)用服務(wù)操 作。如果服務(wù)為 Session 服務(wù)或 Singleton 服務(wù),那么即使發(fā) 生了異常,服務(wù)對象也不會(huì)被終結(jié)。DirectoryNotFoundException except
12、ion = newDirectoryNotFoundException();throw newFaultException<DirectoryNotFoundException>(exception new FaultReason(string.Format("Directory 0 is not found.", homeDir);includeExceptionDetailInFaults只是為了讓客戶端獲得異常消息,即使不施加 FaultContract特性,或者拋出非 FaultException 異常,我們也可以通過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 允許開發(fā)者定制異常報(bào)告和異常傳遞的過程。 但是要實(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);通過這樣的處理,即使服務(wù)拋出的異常為DirectoryNotFoundException 異常,并且在服
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025委托招標(biāo)代理合同
- 2025【合同范本】建筑工程施工合同示本
- 2025二手空調(diào)購銷合同范本
- 長城遺址修繕方案
- 促銷活動(dòng)合同范例
- 2024年六年級品社下冊《去中學(xué)看看》說課稿2 蘇教版
- 配件報(bào)價(jià)實(shí)施方案
- 2024年五年級英語下冊 Unit 4 Did You Have a Nice Trip Lesson 19 Li Ming Goes Home說課稿 冀教版(三起)
- 貴州籠式球場護(hù)欄施工方案
- 砂石加工賬目處理方案
- 城市道路智慧路燈項(xiàng)目 投標(biāo)方案(技術(shù)標(biāo))
- 水泥采購?fù)稑?biāo)方案(技術(shù)標(biāo))
- 醫(yī)院招標(biāo)采購管理辦法及實(shí)施細(xì)則(試行)
- 初中英語-Unit2 My dream job(writing)教學(xué)設(shè)計(jì)學(xué)情分析教材分析課后反思
- 廣州市勞動(dòng)仲裁申請書
- 江西省上饒市高三一模理綜化學(xué)試題附參考答案
- 23-張方紅-IVF的治療流程及護(hù)理
- 頂部板式吊耳計(jì)算HGT-20574-2018
- 因數(shù)和倍數(shù)復(fù)習(xí)思維導(dǎo)圖
- LY/T 2986-2018流動(dòng)沙地沙障設(shè)置技術(shù)規(guī)程
- 三級教育考試卷(電工)答案
評論
0/150
提交評論