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

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

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

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

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

你能帮助我吗?谢谢!

4

3 回答 3

2

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

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

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

于 2012-04-25T15:03:07.380 回答
1

MSDN ServiceBehviorAttribute.concurrencyMode状态:

将 ConcurrencyMode 设置为 Single 指示系统将服务实例一次限制为一个执行线程,从而使您无需处理线程问题。

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

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

于 2012-04-25T21:11:08.017 回答
0

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

于 2012-04-25T15:02:46.093 回答