Reporting services 循环中对WCF服务方法的多次调用(使用相同的代理对象)导致超时

Reporting services 循环中对WCF服务方法的多次调用(使用相同的代理对象)导致超时,reporting-services,windows-services,timeout,wcf,Reporting Services,Windows Services,Timeout,Wcf,我在一个循环中重复调用一个WCF服务方法(在每次迭代中使用不同的参数),它会在大约40分钟后导致超时。我使用的是同一个代理对象,并且仅在循环像这样完成后才关闭它。如何避免此超时错误?我是否需要为每个调用实例化一个新代理。(实际上,我在这里调用SQL server reporting server Web服务,并传递不同的参数以生成不同的报告,并且我没有为每次迭代使用新的代理,因为这样可能会减慢报告的生成)。这里是客户端也是一个WCF服务,它托管在一个windows服务中 (这只是一个示例,不是失

我在一个循环中重复调用一个WCF服务方法(在每次迭代中使用不同的参数),它会在大约40分钟后导致超时。我使用的是同一个代理对象,并且仅在循环像这样完成后才关闭它。如何避免此超时错误?我是否需要为每个调用实例化一个新代理。(实际上,我在这里调用SQL server reporting server Web服务,并传递不同的参数以生成不同的报告,并且我没有为每次迭代使用新的代理,因为这样可能会减慢报告的生成)。这里是客户端也是一个WCF服务,它托管在一个windows服务中

(这只是一个示例,不是失败的实际代码)

使用(var proxy=new serviceclient())
{
for(var i=0;i System.TimeoutException):对
'http://localhost/ReportServer/ReportExecution2005.asmx'
已超过分配的超时
00:01:00。分配给此的时间
操作可能是一个过程的一部分
更长的超时时间。-->
System.Net.WebException:操作失败
已超时

以下是客户端WCF配置(仅与reporting services相关的部分,而不是整个WCF配置)


如果您正在从客户端进行异步调用,而服务器不是“webfarm”,则所有调用都将在服务器上进行查询。这可能会导致调用超时。这并不是说从您的代码开始

假设您正在浏览一个包含10项的列表,每个响应在服务器上处理需要10秒。因为您使用的是同一个代理,所以从客户端代码发送所有调用都会非常快。但返回所有答案大约需要100秒(注意,我没有考虑网络延迟、对象序列化等) 这意味着nr6之后的所有调用都将超时

如果服务器有更多线程可用于处理数据,这是可以避免的,但问题可能会在其他地方弹出。您应该能够再次尝试相同的调用,因为超时也可能导致任何其他原因,如网络问题、临时服务器过载等

我建议建立某种quing系统,分派所有服务器调用,以便您可以再次进行相同的调用。如何实现取决于您的场景: 它们是否需要按特定顺序发送? 你需要知道最后一个电话什么时候回的吗?
等等。

这意味着服务器无法处理负载,或者由于其他原因花费的时间太长。询问服务器为什么花费的时间太长;当客户端超时时,不要感到惊讶。

此问题现在已解决。其中一个报告(通过调用报告服务器ASMX webservice生成)花费的时间比平常长并导致超时,这不是因为循环中的调用数(每个webservice调用都是同步的,没有排队)。为了解决这个问题,我使用标准ASP.NET webservice API而不是WCF来调用报表执行webservice,并将超时设置为无限,如下所示

    var webServiceProxy = new ReportExecutionServiceReference.ReportExecutionService()
                              {
                                  Url = ConfigurationManager.AppSettings["ReportExecutionServiceUrl"],
                                  Credentials = System.Net.CredentialCache.DefaultCredentials
                              };
    webServiceProxy.Timeout = Timeout.Infinite;

超时可以设置为更大的值,而不是无限。此Web服务在每个报表的循环中调用,一次生成所有用户选择的报表大约需要两个小时。客户端是WCF服务,托管在windows服务中而不是IIS中,以避免客户端超时。感谢所有回复

在这里,每个方法调用都是同步的,因此客户端在请求另一个报告之前会等待报告生成。现在,我尝试实例化并关闭每个调用的代理,看看它是否有效。感谢您的回复
Dim ws As WCFService.ServiceClient = New WCFService.ServiceClient
ws.Endpoint.Binding.SendTimeout() = TimeSpan.FromSeconds(2)
    var webServiceProxy = new ReportExecutionServiceReference.ReportExecutionService()
                              {
                                  Url = ConfigurationManager.AppSettings["ReportExecutionServiceUrl"],
                                  Credentials = System.Net.CredentialCache.DefaultCredentials
                              };
    webServiceProxy.Timeout = Timeout.Infinite;
Dim ws As WCFService.ServiceClient = New WCFService.ServiceClient
ws.Endpoint.Binding.SendTimeout() = TimeSpan.FromSeconds(2)