gpt4 book ai didi

WCF、双工回调、recieveTimeout netTcpBinding

转载 作者:行者123 更新时间:2023-12-04 16:56:36 27 4
gpt4 key购买 nike

我有一个使用 netTcpBinding 和回调方法的主机/客户端 WCF 服务和客户端。

<bindings>
<netTcpBinding>
<binding name="tcp_Unsecured" receiveTimeout="00:01:00" sendTimeout="00:01:00">
<security mode="None" />
<reliableSession enabled="true" ordered="true" inactivityTimeout="00:10:00"/>
</binding>
</netTcpBinding>
</bindings>

代理
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace="http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples", ConfigurationName="AlarmServer", CallbackContract=typeof(AlarmServerCallback), SessionMode=System.ServiceModel.SessionMode.Required)]
public interface AlarmServer
{

[System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/RegisterAlarm")]
void RegisterAlarm(System.DateTime alarmTime, string clientName, string reminderMessage);

[System.ServiceModel.OperationContractAttribute(IsOneWay = true, Action = "http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/unRegisterAlarm")]
void unRegisterAlarm(string clientName);

[System.ServiceModel.OperationContractAttribute(IsOneWay = true, Action = "http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/broadcastMessage")]
void broadcastMessage(string msg);
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface AlarmServerCallback
{

[System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/SignalAlarm")]
void SignalAlarm(string reminderMessage);

[System.ServiceModel.OperationContractAttribute(IsOneWay = true, Action = "http://dotnetaddict.dotnetdevelopersjournal.com/wcf.samples/AlarmServer/displayMessage")]
void displayMessage(string msg);
}

带有回调的客户端实例
public MainForm()
{
InitializeComponent();
InstanceContext context = new InstanceContext(new AlarmCallback());
client = new AlarmServerClient(context);
}

我遇到的问题是绑定(bind)recieveTimeout 触发后,客户端进入故障状态并关闭客户端监听回调。

我可以使用来自 sysinternals 的 TCPVIEW 看到监听端口下降。

如果我让 channel 保持忙碌,则不会触发超时,因此它不是发送给服务器/客户端的 WCF 消息中的故障,因为多条消息将正常流过。

我认为 receiveTimeout 旨在提供一种方法来检测 WCF 消息通过 TCP 的回复是否失败?
为什么会出现连接错误。
几乎可以看出,如果超时期间没有创建回调对象,那么 channel 就关闭了?

我究竟做错了什么?

最佳答案

似乎接收超时会导致回调主机服务在达到其最大计数后出现故障。这是 23.59 小时或默认值 1 分钟。
我可以通过将 receivetimeout 设置为 Infinate 来解决超时问题

 <bindings>
<netTcpBinding>
<binding name="NetTcpBinding_AlarmServer" receiveTimeout="infinite" >
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>

但这让我现在想知道我是否真的在 WFC 中使用正确的工具进行服务器/客户端通信。我希望主机/服务器在文件服务器上运行,并且多个远程客户端连接到它。客户端会用心跳 ping 服务器,偶尔服务器可能会向客户端发送命令。我正在使用远程处理或 tcpsockets 并使用“客户端轮询方法”来执行此操作,其中命令在数据库中排队,当客户端每 10 分钟轮询一次服务器以获取命令时,如果该唯一客户端有待处理的命令它得到它。这工作正常,并且具有与服务器没有 1000 个打开的 tcp 套接字连接的优点,因为客户端只会随机连接和断开连接。
但是我决定尝试 WCF(毕竟这不是替代 Remoting 的最新的最新技术吗?)当我找到 Duplex 时,我想,我会使用它....
现在我在想我错过了关于 WCF Duplux 是什么的重点???

帮助我错过了这里的概念???

关于WCF、双工回调、recieveTimeout netTcpBinding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2819227/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com