2017-02-11 277 views
1

我調查一件壞事,假設我們有一個數據服務,我們希望把它稱之爲消費方面,如:平WCF數據服務或WCF服務

Uri dataManURI = new Uri("http://localhost:2040/DTService.svc/rest"); 
DataServiceContext dataServiceContext = new DataServiceContext(dataManURI); 
var all = from ex in dataServiceContext.CreateQuery<ExternalPath_DTO>("ExternalPaths") 
                 select ex; 

很長一段時間我會得到:

未能加載外部路徑!EXP:System.Data.Services.Client.DataServiceTransportException:操作已超時---> System.Net.WebException:操作已在超時 System.Net .HttpWebRequest.GetResponse() at System.Data.Services.Client.HttpWebRequestMessage.GetResponse() ---內部異常堆棧跟蹤的末端--- 位於System.Data.Services.Client.HttpWebRequestMessage.GetResponse() 位於System.Data.Services .Client.DataServiceContext.GetResponseHelper(ODataRequestMessageWrapper請求,IAsyncResult的asyncResult,布爾handleWebException) 在System.Data.Services.Client.QueryResult.ExecuteQuery()

或WCF服務:

AuthClient ac = new AuthClient("authEndPoint", Token); 
ac.RemoveUser(new RemoveUser_DTO_IN() { UserId = uidToDel }); 

所以如果該服務不可用是需要很長的時間我想趕上例外,我認爲如果我設置receivetimeout00:01:00它將需要1分鐘知道操作超時。

在另一端UI 被凍結直到響應(在我的情況下1分鐘得到失敗響應)。

如果是這些解決方案是有用的,但如何?

1-定義一個簡單的操作,如Ping()並在任何主操作之前調用它?

AuthClient ac = new AuthClient("authEndPoint", Token); 
    var watch = System.Diagnostics.Stopwatch.StartNew(); 
    var ping = Task.Run(() => 
    { 
     ac.Ping(); 
    }); 
    try 
    { 
    if (!ping.Wait(ac.Endpoint.Binding.OpenTimeout)) 
     { 
      //Timeout on Ping for end point 
      watch.Stop(); 
      return; 
     } 
    } 
    catch (Exception exp) 
    { 
     watch.Stop(); 
     return; 
    } 

我的期望是獲得3秒內響應(開超時),在我看來,如果一個Ping()不會在3秒內回覆則該服務不可用。

2- telnet服務?

解決方案1:我認爲解決方案1也不是沒有任務的編程和!ping.Wait(ac.Endpoint.Binding.OpenTimeout)適當的,因爲我上面的解釋,如果服務不可用,那麼它會拿1分(終點接收時間)的說法操作得到超時。

解決方案2:怎麼樣,真實的例子?

是否有任何其他機制知道服務可用或不可用的速度非常快?

任何幫助將被真正讚賞。

+0

_「喚醒服務」_或_「ping服務以查看服務是否存在」_是XY問題。你的實際問題是_「當調用服務時,客戶端得到超時」_,所以修復**問題。調查爲什麼服務需要很長時間才能做出迴應。它可能會正常運行,並且在您平穩運行時會很高興地迴應,但是您打算執行的操作仍然會超時,因爲它會導致性能不佳的數據庫或其他任何事情。 – CodeCaster

+0

我知道這可能是因爲網絡問題,而不是代碼性能或任何與我的代碼相關的問題。 – Aria

回答

0

您是否試過Warm-up your IIS pool initialization

網站管理員面臨的一個常見問題是需要爲Web應用程序執行初始化任務和「預熱」任務。在服務第一個HTTP請求之前,更大和更復雜的Web應用程序可能需要執行冗長的啓動處理,優質內存緩存,生成內容等。

IIS 8.0應用程序初始化功能使網站管理員能夠配置IIS 8.0以主動執行一個或多個Web應用程序的初始化任務。

我一直面臨類似的問題 - 但沒有那麼多(1分鐘+)。通常IIS需要幾秒鐘(10〜20秒)來初始化,因此操縱回收間隔(默認1740分鐘)和空閒超時(默認20分鐘)可能會改善您的服務。