剛學wcf的時候沒發現這個問題,調得很愉快卻沒有發現其實「暗藏殺機」,可謂危險重重,還好後來覺得是有些不妥,於是google「wcf需要關閉嗎」,立馬找到了幾個的鏈結,進去一看,各位大俠均紛紛表示「關是一定要關的,但是你還不能用完就關,因為關了,就不能再開啟了,還得new,可以new的成本又有一點高」,好吧,這麼說來就只有好好規劃一下了。
那麼什麼時候該關呢,答案是異常了的時候,msdn給出了**(錯誤處理部分,找不到鏈結了,見諒)
catch
(communicationexception)
catch
(timeoutexception)
所以這樣一來,就有了解決方案,那就是在每一處需要呼叫wcf和**裡加上try catch,大概就成了如下這樣
userclientclient
=new
userclient();
try);}
catch
(communicationexception)
catch
(timeoutexception)
這樣挺好的,沒錯,不過我們總不可能只呼叫乙個wcf介面吧,我們要調的可是一系列,也就是若干介面,那麼就我們就需要寫很多重複的錯誤處理**塊了。這樣原來沒什麼問題,而且是理所當然的事情。可是我記得某位老鳥說過當**出現很大程度重複的時候你就該重構它了(也是在看到了,很普通但深入人心的道理),並且為了讓**好看一點,我們還是想想好點的辦法。
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
tchannelgetchannel()
}else
if(instance.state
!=communicationstate.opened
&&instance.state
!=communicationstate.opening)
instance.open();
return
instance;
}///
///直接呼叫,無返回值
///
public
static
void
invoke(action
<
tchannel
>
action)
,instance);
}///
///有返回值的呼叫
///
public
static
tresultinvoke
<
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...