WCF IsOneWay = true报告异常

时间:2012-04-25 14:25:29

标签: wcf

[ServiceContract]
public interface Service
{
   [OperationContract(IsOneWay = true)]
   void ServiceMethod();
}

我使用IsOneWay = true设置服务器代码,因为客户端不关心服务器的结果,并且服务器的方法在某些情况下可能需要运行很长时间(例如30分钟)。

但我发现客户端仍在等待服务器的方法完成。服务器在30分钟内完成后,客户端再次请求,报告CommunicationException

  

“套接字连接已中止。这可能是由错误引起的   处理您的消息或超过接收超时   远程主机或底层网络资源问题。本地套接字   超时是'00:01:00'“。

我认为客户端仍在等待结果(默认receiveTimeOut为10分钟),然后导致超时。我使用WCF 3.0。

你能帮帮我吗?谢谢!

3 个答案:

答案 0 :(得分:2)

WCF中的单向调用与异步调用不同。

即使进行单向调用的客户端不会收到来自服务的响应,如果服务没有可用于调度或排队传入客户端请求的线程,那么客户端将挂起并最终超时(如果没有调度程序)线程在超时期限内变为可用。

可用线程的数量和请求队列的大小由WCF管理,由服务并发模式,会话模式以及服务是否配置了可靠的消息传递以及其他因素决定。

答案 1 :(得分:1)

MSDN ServiceBehviorAttribute.concurrencyMode州:

  

将ConcurrencyMode设置为Single可指示系统进行限制   一次执行一个执行线程的服务实例   让你免于处理线程问题。

这意味着服务器端对服务的所有调用都将在一个唯一的线程上进入。这很棒,因为你不必担心多线程,但不是那么好,如果你用一个长操作来阻止那个线程,那么来自你的客户端的其他调用会在它的处理无法通过时发生。因此例外。

ConcurrancyMode = Single是默认值。您可以尝试将concurrancy模式设置为Multiple - 这意味着调用现在将进入随机线程池线程,如果其中一个忙于处理请求,则另一个请求可用于另一个请求。但是因为环境现在是多线程的,所以你必须保护服务器对象不被具有锁或其他同步机制的多个线程访问。

答案 2 :(得分:0)

您是否尝试过重新生成服务客户端?可能是客户端仍然引用了同步操作,而服务器已经被重新定义为单向/异步。