【问题标题】:wcf oneway non blocking operationwcf 单向非阻塞操作
【发布时间】:2013-02-13 11:17:06
【问题描述】:

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

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

cliend.SendMessage("msg");
}

在防火墙打开或没有连接到互联网的情况下,客户端在“SendMessage”处死机。我的意思是程序停止响应。我希望程序不关心结果。我的意思是如果没有连接,我希望程序走得更远,省略“SendMessage”之类的。

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

【问题讨论】:

  • 编辑了我的答案,请看一下

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


【解决方案1】:

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

[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,以便每条消息都可以由 不同的服务实例,并将ConcurrencyMode 设置为 Multiple 为了允许多个线程发送消息 一次。另一种方法是增加读取配额 服务和客户端绑定。

【讨论】:

  • “使用异步调用”意味着尝试从不同的线程连接到端点或类似的东西?抱歉,我对 WCF 很陌生
  • 首先尝试第 3 段中的内容 - 将 System.ServiceModel.ServiceBehaviorAttribute.InstanceContextMode 属性设置为 PerCall (...),并将 ConcurrencyMode 设置为 Multiple
  • @santBart:这也可能有帮助:stackoverflow.com/questions/400798/…
  • 我想知道我是否可以使用像“client.InnerChannel.OperationTimeout = TimeSpan.FromSeconds(1);”这样的东西当它工作正常时,发送需要 2 秒,以防出现异常“请求通道在 00:00:00 之后尝试发送超时。增加传递给请求调用的超时值或增加绑定上的 SendTimeout 值。分配给此操作的时间可能是较长超时的一部分。”持续 8 秒。我正在寻找可能最简单的解决方案。
  • @santBart:在我的回答中,您可以找到不同的方法来解决您的问题,现在由您自己尝试,直到找到适合您的方法。
【解决方案2】:

修改你的属性

[OperationContract(IsOneWay=true)]

【讨论】:

  • 已经有这个属性了。 ServiceContract(SessionMode=SessionMode.NotAllowed) OperationContract(IsOneWay=true)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 2019-04-01
  • 2017-04-21
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多