明確的說WCF需要及時關閉

2022-02-22 11:34:13 字數 2121 閱讀 4341

剛學wcf的時候沒發現這個問題,調得很愉快卻沒有發現其實「暗藏殺機」,可謂危險重重,還好後來覺得是有些不妥,於是google「wcf需要關閉嗎」,立馬找到了幾個的鏈結,進去一看,各位大俠均紛紛表示「關是一定要關的,但是你還不能用完就關,因為關了,就不能再開啟了,還得new,可以new的成本又有一點高」,好吧,這麼說來就只有好好規劃一下了。

那麼什麼時候該關呢,答案是異常了的時候,msdn給出了**(錯誤處理部分,找不到鏈結了,見諒)

catch

(communicationexception)

catch

(timeoutexception)

所以這樣一來,就有了解決方案,那就是在每一處需要呼叫wcf和**裡加上try catch,大概就成了如下這樣

userclient client 

=new

userclient();

try);

}catch

(communicationexception)

catch

(timeoutexception)

這樣挺好的,沒錯,不過我們總不可能只呼叫乙個wcf介面吧,我們要調的可是一系列,也就是若干介面,那麼就我們就需要寫很多重複的錯誤處理**塊了。這樣原來沒什麼問題,而且是理所當然的事情。可是我記得某位老鳥說過當**出現很大程度重複的時候你就該重構它了(也是在看到了,很普通但深入人心的道理),並且為了讓**好看一點,我們還是想想好點的辦法。

serviceinvokehelper呼叫輔助類

using

system;

using

system.collections.generic;

using

system.linq;

using

system.text;

using

system.servicemodel;

namespace

helper

catch

(communicationexception)

catch

(timeoutexception)

catch

(exception)

}private

static

tchannel getchannel()

}else

if(instance.state 

!=communicationstate.opened 

&&instance.state 

!=communicationstate.opening)

instance.open();

return

instance;

}///

///直接呼叫,無返回值

///public

static

void

invoke(action

<

tchannel

>

action)

, instance);

}///

///有返回值的呼叫

///public

static

tresult invoke

<

tresult

>

(func

<

tchannel, tresult

>

func)}}

有了以上**,我們就可以這樣調wcf了

serviceinvokehelper

<

userclient

>

.invoke(client

=>

client.create(}));

測試過程中發現這樣不支援out 和ref引數的呼叫,比如這樣是不可以的

public

void

getuserlist(

intpageindex,

intpagesize,

refcount)

但是我們可以變通成如下模樣

public

void

getuserlist(

intpageindex,

intpagesize,

refcount)

參考:msdn(忘記了:-( )

明確的說WCF需要及時關閉

剛學wcf的時候沒發現這個問題,調得很愉快卻沒有發現其實 暗藏殺機 可謂危險重重,還好後來覺得是有些不妥,於是google wcf需要關閉嗎 立馬找到了幾個的鏈結,進去一看,各位大俠均紛紛表示 關是一定要關的,但是你還不能用完就關,因為關了,就不能再開啟了,還得new,可以new的成本又有一點高 好...

明確的說WCF需要及時關閉

剛學wcf的時候沒發現這個問題,調得很愉快卻沒有發現其實 暗藏殺機 可謂危險重重,還好後來覺得是有些不妥,於是google wcf需要關閉嗎 立馬找到了幾個的鏈結,進去一看,各位大俠均紛紛表示 關是一定要關的,但是你還不能用完就關,因為關了,就不能再開啟了,還得new,可以new的成本又有一點高 好...

在web farm中架設需要證書的wcf

makecert r pe n cn 頒發給 ss my sky exchange 此為證書的生成命令,其中 頒發給 需要替換成具體的機器。頒發給誰,則要使用對應的方式來訪問服務 如頒發給www.abc.com則在引用服務的web.config中address就應該是 同樣,機器名,公網ip和內網i...