首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WCF IsOneWay =真报告异常

WCF IsOneWay =真报告异常
EN

Stack Overflow用户
提问于 2012-04-25 14:25:29
回答 3查看 1.4K关注 0票数 2
代码语言:javascript
复制
[ServiceContract]
public interface Service
{
   [OperationContract(IsOneWay = true)]
   void ServiceMethod();
}

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

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

“套接字连接被中止。这可能是由于处理您的消息时出错,或者远程主机超过了接收超时,或者是基础网络资源问题。本地套接字超时时间为‘00:01:00’。”

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

你能帮帮我吗?谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-25 15:03:07

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2012-04-25 21:11:08

MSDN ServiceBehviorAttribute.concurrencyMode声明:

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

这意味着服务器端对服务的所有调用都将以唯一线程的形式出现。这很好,因为您不必担心多线程处理,但也不是很好,因为如果您用长时间的操作阻止一个线程,那么您的客户端的其他调用就会发生,而它的处理将无法通过。因此出现了例外。

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

票数 1
EN

Stack Overflow用户

发布于 2012-04-25 15:02:46

你试过重新生成服务客户端吗?可能是客户端仍然有对同步操作的引用,而服务器被重新定义为单向/异步。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10317748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档