【问题标题】:Change timeout for each WCF method or call更改每个 WCF 方法或调用的超时
【发布时间】:2012-10-08 21:54:36
【问题描述】:

我有一个相当大的“旧”WCF 服务,其中包含许多不同的方法。

这些方法中的大多数都是“正常”的,因此它们应该在 10 秒内回答,但有几种方法(8 或 9)是漫长的过程,因此它们可能需要很长时间才能得到响应。

receivetimeout 和 sendtimeout 设置为 00:40:00,以确保他们有足够的时间来完成这些过程。

问题是有时我们会遇到连接问题,而“正常”方法需要很长时间才能崩溃...

他们都在同一个服务中,因为他们使用一个非常大的模型,并且他们希望在每次调用中重用服务中的模型(没有 PersonsService.User 和 RobotsService.User...,因为它们是相同的不同服务中的类)。

我想的第一个解决方案是用那些长流程创建一个不同的服务,并为正常服务设置一个短的超时时间……但由于模型的使用,我应该做很多改变……

有没有办法在每次调用中设置不同的超时时间?还是通过服务方式?我还是应该分块服务吗?

提前致谢!!

【问题讨论】:

  • 您是否为每个调用重新创建代理对象?如果是,请参阅此链接以获取可能的解决方案:stackoverflow.com/questions/1826392/…
  • 不,我不是,我有一个代理的单身人士。

标签: wcf timeout n-tier-architecture


【解决方案1】:

首先,在您的情况下配置的超时是OperationTimeout,它允许在超时之前等待服务回复的时间限制。您可以在客户端调用之前修改操作超时时间

要在频道上设置OperationTimeout,您可以将您的代理/频道实例键入IContextChannel 并设置OperationTimeout

例如:

IClientChannel contextChannel = channel as IClientChannel;
contextChannel.OperationTimeout = TimeSpan.FromMinutes(10);

HTH, 阿米特

【讨论】:

  • 我该如何配置这个 OperationTimeout?谢谢你的回答:)
  • 面对通道的并发使用,你如何以线程安全的方式做到这一点?设置client.InnerChannel.OperationTimeout 然后从多个线程调用服务不起作用。但我知道 OperationTimeout 设置在操作开始时被读取一次,然后即使您更改了通道的 OperationTimeout,该值对于该调用仍然保持不变。我只是不知道正确的位置在哪里——如果有的话——让它跨线程工作。
猜你喜欢
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 1970-01-01
  • 2011-09-18
  • 2018-11-17
相关资源
最近更新 更多