我调查了一件坏事,假设我们有一个数据服务,我们想在消费者方面调用它,例如:
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:操作已超时---&gt; System.Net.WebException:操作已超时 在System.Net.HttpWebRequest.GetResponse() 在System.Data.Services.Client.HttpWebRequestMessage.GetResponse() ---内部异常堆栈跟踪结束--- 在System.Data.Services.Client.HttpWebRequestMessage.GetResponse() 在System.Data.Services.Client.DataServiceContext.GetResponseHelper(ODataRequestMessageWrapper请求,IAsyncResult asyncResult,Boolean 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:如何,真实的例子?
是否还有其他机制可以非常快速地了解服务是否可用?
任何帮助都会得到真正的赞赏。
答案 0 :(得分:0)
你试过Warm-up your IIS pool initialization吗?
网站管理员面临的一个常见问题是需要执行初始化任务和预热&#34; Web应用程序的任务。更大和更复杂的Web应用程序可能需要在提供第一个HTTP请求之前执行冗长的启动处理,主要内存缓存,生成内容等。
IIS 8.0应用程序初始化功能使网站管理员能够配置IIS 8.0以主动执行一个或多个Web应用程序的初始化任务。
我一直面临类似的问题 - 但不是那么多(1分钟+)。 IIS通常需要几秒钟(10~20秒)来启动,因此操作循环间隔(默认为1740分钟)和空闲超时(默认为20分钟)可能会改善您的服务。