1

我需要这样的场景:客户端向服务器发送消息,而不是等待响应,并且不在乎消息是否正确发送。

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

cliend.SendMessage("msg");
}

在防火墙打开或没有连接到 Internet 的情况下,客户端在“SendMessage”处死机。我的意思是程序停止响应。我希望程序不关心结果。我的意思是如果没有连接,我希望程序更进一步,省略“SendMessage”或类似的东西。

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

4

2 回答 2

5

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

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

请参阅以下链接:

WCF 中的单向操作



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

解决问题的建议方法 - 取自 MSDN(单向服务):

单向操作阻塞的客户端

重要的是要认识到,虽然一些单向应用程序会在出站数据写入网络连接后立即返回,但在某些情况下,绑定或服务的实现可能会导致 WCF 客户端阻塞使用单向操作. 在 WCF 客户端应用程序中,WCF 客户端对象在出站数据写入网络连接之前不会返回。这适用于所有消息交换模式,包括单向操作;这意味着将数据写入传输的任何问题都会阻止客户端返回。根据问题,结果可能是向服务发送消息时出现异常或延迟。

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

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

于 2013-02-13T11:20:41.417 回答
0

修改你的属性

[OperationContract(IsOneWay=true)]
于 2013-02-13T11:20:53.217 回答