系統上線後WCF服務最近經常死掉的原因分析總結

2021-09-06 16:46:56 字數 2439 閱讀 3569

前言  

最近系統上線完修改完各種bug之後,功能上還算是比較穩定,由於最近使用者數的增加,不知為何經常出現無法登入、頁面出現錯誤等異常,後來發現是由於wcf服務時不時的就死掉了。後來就開始分析問題。得到的初步解決方案如下:

1、在web端呼叫wcf服務使用後,未釋放未關閉導致新的鏈結無法訪問

2、增加預設的連線數,系統預設的鏈結數比較小

3、提供同乙個wcf服務的不同例項

1、在web端呼叫wcf服務使用後,未釋放未關閉導致新的鏈結無法訪問  

首先保證客戶端每次建立的連線在使用完成後進行關閉。那麼請不要使用傳統的using語句中來呼叫wcf,這裡@dudu大神也曾經有遇到過這個問題 對其分析也比較全面,在此不再贅述。

不過自己感覺更好的處理方式可能是下面這樣,也就是將@dudu中的方法進行了簡單的封裝,但自己感覺還有優化的空間,暫時還沒試出來。

public static class wcfextensions

catch (communicationexception e)

catch (timeoutexception e)

catch (exception e)}}

進行呼叫看起來是如下的方式,看上去還是比較簡練了,但是感覺還是有些繁瑣,不知道能不能直接一行return**搞定?

另外一種關閉鏈結的方式,這種方式其實和上面那種大同小異,也是可以封裝的,系統中暫且就使用的上面的方式。

document document = null;

documentserviceclient client = new documentservice.documentserviceclient();

try}

catch (exception ex)

return document;

2、增加預設的連線數,系統預設的鏈結數比較小  

如果採用的nettcp繫結,而在windows7中,併發連線數預設是10。

這是原來的配置檔案

將專案移植到伺服器上之後

但有些時候還是不能解決問題,就想到是不是需要配置一下行為,於是將行為的連線數量也改變了

maxconcurrentcalls:在同一時刻允許處理的最大伺服器運算元。如果超過次數,則需要把其他方法呼叫插入佇列中,以等待處理。

maxconcurrentsessions:同時傳輸或應用程式會話的最大個數。

maxconcurrentinstances:例項的最大個數。

增加連線數量

在http協議中,規定了同個http請求的併發連線數最大為2. 這個數值,可謂是太小了。而目前的瀏覽器,已基本不再遵循這個限制,但是dot net平台上的 system.net 還是預設遵循了這個標準的。從而造成了,在使用httpwebrequset 或者 webclient 利用多執行緒的方式,訪問某個**時,經常出現連線被異常關閉的錯誤,大大降低了效率。

這個限制的值,是可以自己設定或配置的。此值設定後,只對以後發起的http請求有效。

3、提供同乙個wcf服務的不同例項

3、首先檢視乙個wcf服務類

裡面有n多建構函式的過載版本,我們來具體看一下第二個建構函式

public documentwriteserviceclient(string endpointconfigurationname) : 

base(endpointconfigurationname)

即傳入配置名生與**類的例項,我們在web.config中的wcf配置節,做如下處理:

修改客戶端的呼叫**

documentwriteserviceclient client = new documentwriteserviceclient();
改為

documentwriteserviceclient client = new documentwriteserviceclient(new random().next(1, 4).tostring());
即客戶端隨機從多個wcf服務端的host中挑乙個,生成**類例項,說白了就是把乙個wcf的host分身成了3個,並且客戶端隨機呼叫3者之一。

如果要考慮到大量併發的情況下,偽隨機數可能確實有一些問題,不過,這個應該也不難解決,自己另外寫乙個類似偽隨機數的演算法,只要保證生成指定範圍內不重複的數字(或字元)就可以了。

總結 暫時這三種方式有效地防止了wcf服務的再次掛掉,至少最近幾天服務一直在穩定的執行,沒有太大的異常,很是讓人欣慰。不知道針對wcf服務的處理是否還有其他方式,也讓的大牛們來指點一二吧。

WCF服務部署後異常的處理

在部署專案的時候,發現wcf總是存在問題,一直沒找出什麼原因。開始在專案開發階段客戶端呼叫wcf服務的 如下 jsajservice.jsajserviceclient ajservice new jsajservice.jsajserviceclient bool iscurrent ajserv...

WCF服務部署後異常的處理

在部署專案的時候,發現wcf總是存在問題,一直沒找出什麼原因。開始在專案開發階段客戶端呼叫wcf服務的 如下 jsajservice.jsajserviceclient ajservice new jsajservice.jsajserviceclient bool iscurrent ajserv...

CIO 系統上線後的九大煩惱

倒騰了兩三個月,開了無數溝通會,熬了無數夜,系統終於成功上線了。這往往是一家企業的cio最初 也最重視的工作。可如果cio們以為從此以後就可以鬆口氣,他們中的大多數人都會覺得失望。因為事實恰恰相反。在記者的採訪中,所碰到的一些已經進行資訊化建設多年的企業cio們都表示 很多人都以為使一套資訊化系統成...