将数据存储在 WCF 的全局集合中

store data in a global collection in WCF

我有一个 WCF,ASP.NET 应用程序每 10-15 分钟调用一次,以通过电子邮件通知客户有关内容。我需要集合来识别邮件已经发送给哪个用户。因此,如果下一个电话打进来,我可以查询这个集合,如果邮件是在上次发送之前和最后一次发送的时间(我设置了一个时间间隔,这样用户就不会每 10-15 分钟收到一次邮件)。

我的问题是 - 当我将它存储在全局时,此集合是否会在调用结束时过期(集合 = 空)? 将 .svc class 中的这个全局集合设置为静态列表就足够了吗?还是我必须设置 DataMember 属性? 代码将如何寻找它?

像那样?

public class Service1 : IService1
{
      private static List<customer> lastSendUserList = new List<customer>();

      void SendMail(int customerid)
      {
           lastSendUserList.FirstOrDefault(x => x.id == customerid);
           .
           // proof date etc. here and send or send not
      }
}

这个 lastSendUserList 是否会保留在 ram/cache 直到我将它设置为 null(或服务器重启等)以便我可以在每次来电时查询它?还是每次调用结束时这个列表都会被 gc 清除?

编辑

所以新代码应该是这样的?!

public class Service1 : IService1
{
      private static List<customer> lastSendUserList = new List<customer>();

      void SendMail(int customerid, int setInterval)
      {
           customer c;
           c = lastSendUserList.FirstOrDefault(x => x.id == customerid);

           if(c != null && c.lastSendDate + setInterval > DateTime.Now)
           {
                lastSendUserList.Remove(x => x.id == c.id);

                // start with sending EMAIL

                lastSendUserList.Add(new customer() { id = customerid, lastSendDate = DateTime.Now }); 
           }
      }
}

假设您添加到lastSendUserList它将始终可用,直到 IIS stops/restarts 您的工作进程。

希望customerLastSendDate!!!

此外,您应该 trim 最后一个,以免它变得太大。所以我的代码看起来像。

TimeSpan const ttl = TimeSpan.FromMinutes(15);
lock (lastSendUserList)
{
  lastSendUserList.Remove(x => x.lastSendDate + ttl < DateTime.Now);
  if (lastSendUserList.Any(x => x.id == customerid))
     return;
}

// ... send the email

lock (lastSendUserList)
{
      customer.lastSendDate = DateTime.Now;
      lastSendUserList.Add(c);
}

由于您在 WCF 服务中,因此您必须是线程安全的。这就是为什么我在 lastSendUserList 周围有一个 lock