wcf单向非阻塞操作

san*_*art 1 .net c# wcf web-services wcf-endpoint

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

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

cliend.SendMessage("msg");
}
Run Code Online (Sandbox Code Playgroud)

在防火墙打开或没有连接到Internet的情况下,客户端在"SendMessage"处死亡.我的意思是程序停止响应.我希望程序不关心结果.我的意思是如果没有连接,我希望程序更进一步,省略"SendMessage"或者像那样.

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

Rui*_*mba 5

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

[OperationContract(IsOneWay=true)]
void Send(string message);
Run Code Online (Sandbox Code Playgroud)

请参阅以下链接:

WCF中的单向操作



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

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

客户端阻止单向操作

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

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

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