首页 > 解决方案 > 在 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);
    }

这是正确的方法吗?如何从服务向每个客户发送通知?

标签: c#wcf

解决方案


回调合约的问题是需要打开连接。“5 分钟”的回调可能会失败,因为根据传输类型,连接可能已因不活动而关闭。

如果遇到问题,您可能需要考虑根本不使用 WCF“回调”,而只是将“客户端”视为另一个服务,并让“服务器”打开与“客户端”的连接并调用它。这将解决任何此类不活动问题。唯一的问题是防火墙问题,因此您可能需要注意 WCF 传输选择和防火墙端口。


推荐阅读