2017-02-11 180 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分钟)可能会改善您的服务。