關(guān)閉WCF鏈接正確方法詳解
WCF是一款由微軟開(kāi)發(fā)的有關(guān)通信的一個(gè)開(kāi)發(fā)框架。它可以為我們創(chuàng)造一個(gè)可靠的,跨平臺(tái)的方式。通常情況下我們關(guān)閉WCF鏈接都是簡(jiǎn)單地寫(xiě)把ICommunicationObject.Close()方法。#t#
但是這個(gè)方法有個(gè)問(wèn)題就是當(dāng)調(diào)用發(fā)生異常時(shí),Close()會(huì)發(fā)生次生的異常,導(dǎo)致鏈接不能正常關(guān)閉。如果當(dāng)這種異常很多時(shí),必然對(duì)系統(tǒng)的穩(wěn)定性有很大的影響,所以我們必須要考慮異常發(fā)生后如何關(guān)閉鏈接的問(wèn)題。
我們可以寫(xiě)一個(gè)擴(kuò)展來(lái)專(zhuān)門(mén)關(guān)閉WCF鏈接,而不是使用原來(lái)的Close
- public static void CloseConnection
(this ICommunicationObject myServiceClient) - {
- if (myServiceClient.State !=
CommunicationState.Opened) - {
- return;
- }
- try
- {
- myServiceClient.Close();
- }
- catch (CommunicationException ex)
- {
- Debug.Print(ex.ToString());
- myServiceClient.Abort();
- }
- catch (TimeoutException ex)
- {
- Debug.Print(ex.ToString());
- myServiceClient.Abort();
- }
- catch (Exception ex)
- {
- Debug.Print(ex.ToString());
- myServiceClient.Abort();
- throw;
- }
- }
然后可以使用這個(gè)擴(kuò)展來(lái)實(shí)現(xiàn)關(guān)閉WCF鏈接:
- protected void Close(T client)
- {
- if (client != null)
- {
- IChannel iChannel = client
as IChannel;- if (iChannel != null)
- iChannel.CloseConnection();
- else
- {
- IDisposable iDisposable =
client as IDisposable;- if (iDisposable != null)
iDisposable.Dispose();- }
- }
- }