[英]wcf oneway non blocking operation
我需要这样的场景:客户端将消息发送到服务器,而不等待响应,并且不在乎消息是否正确发送。
using(host.RemoteService client = new host.RemoteService())
{
client.Open();
cliend.SendMessage("msg");
}
在启用防火墙或没有Internet连接的情况下,客户端会在“ SendMessage”处死亡。 我的意思是程序停止响应。 我希望程序不在乎结果。 我的意思是,如果没有连接,我希望程序能走得更远,省略“ SendMessage”或类似的内容。
我该怎么办,非阻塞方法有解决方案吗?
在您的服务合同中尝试以下操作:
[OperationContract(IsOneWay=true)]
void Send(string message);
请参阅以下链接:
编辑:OP已经在使用我建议的解决方案。
建议的解决问题的方法-摘自MSDN( 一站式服务 ):
客户阻止单向操作
重要的是要意识到,尽管某些单向应用程序将出站数据写入网络连接后立即返回,但是在某些情况下,绑定或服务的实现可能导致WCF客户端使用单向操作进行阻塞。 在WCF客户端应用程序中,只有将出站数据写入网络连接后,WCF客户端对象才会返回。 对于所有消息交换模式(包括单向操作)都是如此。 这意味着将数据写入传输中的任何问题都会阻止客户端返回 。 根据问题,结果可能是异常,也可能是向服务发送消息的延迟。
您可以通过在客户端对象和客户端传输的send操作之间插入缓冲区来缓解某些问题。 例如, 使用异步调用或使用内存中消息队列可以使客户端对象快速返回 。 两种方法都可以增加功能,但是线程池和消息队列的大小仍然会限制。
相反,建议您检查服务以及客户端上的各种控件,然后测试您的应用程序方案,以确定双方的最佳配置。 例如,如果使用会话阻止了服务上消息的处理,则可以将
System.ServiceModel.ServiceBehaviorAttribute.InstanceContextMode
属性设置为PerCall
以便可以由不同的服务实例处理每条消息,并将ConcurrencyMode
设置为Multiple
以允许多个线程在同一时间发送消息。 另一种方法是增加服务和客户端绑定的读取配额。
修改属性
[OperationContract(IsOneWay=true)]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.