wcf单向非阻塞操作

时间:2013-02-13 11:17:06

标签: c# .net wcf web-services wcf-endpoint

我需要这样的场景:客户端向服务器发送消息,而不是等待响应,如果消息发送正确,则不关心。

using(host.RemoteService client = new host.RemoteService())
{
client.Open();

cliend.SendMessage("msg");
}

在启用防火墙或没有连接到互联网的情况下,客户端在“SendMessage”处死亡。我的意思是程序停止响应。我希望程序不关心结果。我的意思是如果没有连接,我希望程序更进一步,省略“SendMessage”或者像那样。

我该怎么办,是否有非阻塞方法的解决方案?

2 个答案:

答案 0 :(得分:5)

在服务合同中尝试这样的事情:

[OperationContract(IsOneWay=true)]
void Send(string message);

请参阅以下链接:

One Way Operation in WCF



编辑:OP已经在使用我建议的解决方案了。

解决问题的建议方法 - 取自MSDN(One-Way Services):

  

使用单向操作阻止客户端

     

重要的是要意识到一些单向应用程序会返回   一旦出站数据写入网络连接,就在   几种情况下绑定或服务的实现都可以   导致WCF客户端阻止使用单向操作。在WCF客户端中   应用程序,WCF客户端对象直到出站才返回   数据已写入网络连接。 这是真的   所有消息交换模式,包括单向操作;这个   意味着将数据写入传输的任何问题都会阻止   客户退货。根据问题,结果可以   是向服务发送消息的例外或延迟。

     

您可以通过在其间插入缓冲区来缓解此问题   客户端对象和客户端传输的发送操作。对于   例如,使用异步调用或使用内存中的消息   queue可以使客户端对象快速返回。都   方法可能会增加功能,但可能会增加线程池的大小   并且消息队列仍然强制执行限制。

     

相反,建议您检查各种控件   服务以及客户端,然后测试您的应用程序   用于确定任何一方的最佳配置的方案。对于   例如,如果使用会话阻止了消息的处理   在您的服务上,您可以设置   System.ServiceModel.ServiceBehaviorAttribute.InstanceContextMode   属性PerCall,以便每个消息都可以由a处理   不同的服务实例,并将ConcurrencyMode设置为   Multiple以允许多个线程分派消息   一次。另一种方法是增加读取配额   服务和客户端绑定。

答案 1 :(得分:0)

修改您的属性

[OperationContract(IsOneWay=true)]