我需要这样的场景:客户端向服务器发送消息,而不是等待响应,如果消息发送正确,则不关心。
using(host.RemoteService client = new host.RemoteService())
{
client.Open();
cliend.SendMessage("msg");
}
在启用防火墙或没有连接到互联网的情况下,客户端在“SendMessage”处死亡。我的意思是程序停止响应。我希望程序不关心结果。我的意思是如果没有连接,我希望程序更进一步,省略“SendMessage”或者像那样。
我该怎么办,是否有非阻塞方法的解决方案?
答案 0 :(得分:5)
在服务合同中尝试这样的事情:
[OperationContract(IsOneWay=true)]
void Send(string message);
请参阅以下链接:
编辑:OP已经在使用我建议的解决方案了。
解决问题的建议方法 - 取自MSDN(One-Way Services):
使用单向操作阻止客户端
重要的是要意识到一些单向应用程序会返回 一旦出站数据写入网络连接,就在 几种情况下绑定或服务的实现都可以 导致WCF客户端阻止使用单向操作。在WCF客户端中 应用程序,WCF客户端对象直到出站才返回 数据已写入网络连接。 这是真的 所有消息交换模式,包括单向操作;这个 意味着将数据写入传输的任何问题都会阻止 客户退货。根据问题,结果可以 是向服务发送消息的例外或延迟。
您可以通过在其间插入缓冲区来缓解此问题 客户端对象和客户端传输的发送操作。对于 例如,使用异步调用或使用内存中的消息 queue可以使客户端对象快速返回。都 方法可能会增加功能,但可能会增加线程池的大小 并且消息队列仍然强制执行限制。
相反,建议您检查各种控件 服务以及客户端,然后测试您的应用程序 用于确定任何一方的最佳配置的方案。对于 例如,如果使用会话阻止了消息的处理 在您的服务上,您可以设置
System.ServiceModel.ServiceBehaviorAttribute.InstanceContextMode
属性PerCall
,以便每个消息都可以由a处理 不同的服务实例,并将ConcurrencyMode
设置为Multiple
以允许多个线程分派消息 一次。另一种方法是增加读取配额 服务和客户端绑定。
答案 1 :(得分:0)
修改您的属性
[OperationContract(IsOneWay=true)]