c# - 在 WCF 服务中管理和保存每个连接用户的详细信息
问题描述
我有一个 winform 应用程序和一个 wcf 服务。我的意图是,当我的 winform 应用程序向 wcf 服务发送请求消息时,该服务必须存储客户端请求的详细信息,一段时间后,wcf 将向 winform [client] 应用程序返回一个回调。
假设将有 10 个这样的客户端向这个 wcf 服务发送请求,并且在 5 分钟后,该服务将通过发送“hi”消息向每个客户端发送回调消息。
我的服务实现是这样的。
[ServiceContract(SessionMode = SessionMode.Required, CallbackContract =
typeof(IServiceCallBacks))]
public interface IService
{
[OperationContract]
void Connect(User user);
}
而我的回调方法如下图
public interface IServiceCallBacks
{
[OperationContract(IsOneWay = true)]
void ContactsUpdated(List<Contact> updatedContacts);
}
这是实现
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class Service : IService
{
List<User> users = new List<User>();
public Service()
{
}
public void Connect(User user)
{
users.Add(user);
}
这是正确的方法吗?如何从服务向每个客户发送通知?
解决方案
回调合约的问题是需要打开连接。“5 分钟”的回调可能会失败,因为根据传输类型,连接可能已因不活动而关闭。
如果遇到问题,您可能需要考虑根本不使用 WCF“回调”,而只是将“客户端”视为另一个服务,并让“服务器”打开与“客户端”的连接并调用它。这将解决任何此类不活动问题。唯一的问题是防火墙问题,因此您可能需要注意 WCF 传输选择和防火墙端口。
推荐阅读
- python - 使用 numpy 数组格式化打印语句
- r - 在我的 Latex 表中使用 kableExtra() 打破超链接
- javascript - 数据表以编程方式搜索各个列
- javascript - 使用 `novalidate` 提交带有无效输入的表单
- spring-data-mongodb - 是否可以使用 @Indexed 或 @CompoundIndex 注释为特定集合创建索引
- php - 仅在 WooCommerce 中自动为特定国家/地区应用优惠券折扣
- java - 3D 空间中的 OpenGL“分层”条件/相对透明度 (Java)
- haskell - 需要解释 Lambda 演算
- java - 当您尝试捕获块时,是否正在检查文件对象是否存在简化和不良样式?
- c - 函数大小问题的 Valgrind 错误?