Ping 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()位于System.Data.Services.Client.HttpWebRequestMessage.GetResponse()---内部异常堆栈跟踪结束---位于System.Data.Services.Client.HttpWebRequestMessage.GetResponse()位于System.Data.Services.Client.DataServiceContext.GetResponseHelper(ODataRequestMessageWrapper请求,IAsyncResult asyncResult,布尔句柄WebException)位于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:我认为没有任务编程和!ping.Wait(ac.Endpoint.Binding.OpenTimeout)的解决方案1是不合适的,因为我上面的解释,如果服务不可用,则需要1分钟(终点接收时间)才能说操作超时。

解决方案2:如何,真实示例?

有没有其他机制可以很快知道服务是否可用?

任何帮助都将不胜感激。

您是否尝试过预热IIS池初始化?

网站管理员面临的一个常见问题是需要执行初始化任务;"预热";web应用程序的任务。在提供第一个HTTP请求之前,更大、更复杂的web应用程序可能需要执行漫长的启动处理、在内存中缓存缓存、生成内容等。

IIS 8.0应用程序初始化功能使网站管理员能够将IIS 8.0配置为主动执行一个或多个web应用程序的初始化任务。

我也遇到过类似的问题,但没有那么多(1min以上)。IIS通常需要几秒钟(10~20秒)才能初始化,因此操作回收间隔(默认为1740分钟)和空闲超时(默认为20分钟)可能会改善您的服务。

最新更新