Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# wcf单向非阻塞操作_C#_.net_Wcf_Web Services_Wcf Endpoint - Fatal编程技术网

C# wcf单向非阻塞操作

C# wcf单向非阻塞操作,c#,.net,wcf,web-services,wcf-endpoint,C#,.net,Wcf,Web Services,Wcf Endpoint,我需要这样的场景:客户端向服务器发送消息,不等待响应,也不关心消息是否正确发送 using(host.RemoteService client = new host.RemoteService()) { client.Open(); cliend.SendMessage("msg"); } 在防火墙打开或未连接到internet的情况下,客户端在“SendMessage”处死亡。我的意思是程序停止响应。我希望程序不关心结果。我的意思是,若并没有连接,我希望程序更进一步,省略“SendMess

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

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客户端对象在出站 数据已写入网络连接这对我们来说是正确的 所有消息交换模式,包括单向操作;这 意味着将数据写入传输的任何问题都会阻止 从返回的客户端。根据问题的不同,结果可能不同 向服务发送消息时可能出现异常或延迟

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

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


在您的服务合同中尝试以下内容:

[OperationContract(IsOneWay=true)]
void Send(string message);
请参阅以下链接:



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

解决此问题的建议方法-摘自MSDN():

使用单向操作阻塞客户端 重要的是要认识到,当一些单向应用程序返回 一旦出站数据写入网络连接,在 绑定或服务的实现可能会出现几种情况 使用单向操作导致WCF客户端阻塞。在WCF客户端中 在应用程序中,WCF客户端对象在出站 数据已写入网络连接这对我们来说是正确的 所有消息交换模式,包括单向操作;这 意味着将数据写入传输的任何问题都会阻止 从返回的客户端。根据问题的不同,结果可能不同 向服务发送消息时可能出现异常或延迟

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

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

修改您的属性

[OperationContract(IsOneWay=true)]
修改您的属性

[OperationContract(IsOneWay=true)]

它已经有了这样的安替比妥。ServiceContract(SessionMode=SessionMode.NotAllowed)OperationContract(IsOneWay=true)它已经有了这样的一个属性。ServiceContract(SessionMode=SessionMode.NotAllowed)OperationContract(IsOneWay=true)编辑了我的答案,请看一看编辑了我的答案,请看一看“使用异步调用”的意思是尝试从不同的线程连接到端点还是诸如此类?对不起,我对WCFTry很陌生,第3段中首先写了什么-将System.ServiceModel.ServiceBehaviorAttribute.InstanceContextMode属性设置为PerCall(…),并将ConcurrencyMode设置为Multiple@santBart当前位置这可能也有帮助:我想知道我是否可以用“client.InnerChannel.OperationTimeout=TimeSpan.FromSeconds(1);“正常工作时,发送需要2秒,以防出现异常”请求通道在00:00:00之后尝试发送时超时。增加传递给请求调用的超时值或增加绑定上的SendTimeout值。分配给此操作的时间可能是一段时间的一部分