我調查一件壞事,假設我們有一個數據服務,我們希望把它稱之爲消費方面,如:平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 });
所以如果該服務不可用是需要很長的時間我想趕上例外,我認爲如果我設置receivetimeout
到00: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:怎麼樣,真實的例子?
是否有任何其他機制知道服務可用或不可用的速度非常快?
任何幫助將被真正讚賞。
_「喚醒服務」_或_「ping服務以查看服務是否存在」_是XY問題。你的實際問題是_「當調用服務時,客戶端得到超時」_,所以修復**問題。調查爲什麼服務需要很長時間才能做出迴應。它可能會正常運行,並且在您平穩運行時會很高興地迴應,但是您打算執行的操作仍然會超時,因爲它會導致性能不佳的數據庫或其他任何事情。 – CodeCaster
我知道這可能是因爲網絡問題,而不是代碼性能或任何與我的代碼相關的問題。 – Aria