【问题标题】:WCF Web service and timersWCF Web 服务和计时器
【发布时间】:2012-12-04 23:23:56
【问题描述】:

我计划创建一个将托管在 IIS 上的 Web 服务来处理预订。其中一种方法是

ReserveTimeSlot() 将reservationID 返回给客户端。客户有 2 分钟的时间确认预订或取消预订。如果它没有响应,则在 2 分钟后取消预订。预订存储在数据库中。

我不确定如何在 Web 服务调用中实现 2 分钟超时。需要有用的建议。

【问题讨论】:

    标签: wcf


    【解决方案1】:

    这是可能的解决方案之一。

    1. 当 reservationID 也存储到数据库存储到期日期时,在您的情况下 DataTime expires = DateTime.Now.AddMinutes(2);

    2. 当客户端返回reservationID时,您需要检查reservationID是否存在以及它是否仍然有效(DateTime.Now

    【讨论】:

    • 如果客户再也没有回来怎么办?
    • 这不是问题。假设您有用于reservationID 验证的存储过程。如果您愿意,可以通过清理过期请求来扩展此存储过程。这样,您将根据需要删除所有尚未确认的请求(客户端从未返回)。
    • 预约需要在2分钟内清除,因为只有一个预约可以占用一个时隙。我需要一个能在 2 分钟内完成的解决方案。
    • 如果您坚持计时器概念,那么您将不得不使 wcf 单例(这是一个糟糕的选择,会破坏 wcf 性能,可能会导致状态松散)。无论如何这里是链接:wcftutorial.net/Singleton-Service.aspx 然后在您的单个实例中,您将必须启动新的线程或任务,以清除 wcf 应用程序状态中的过期请求。在这里您可以阅读有关线程msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx 和这里有关任务msdn.microsoft.com/en-us/library/… 的信息
    • 但最终将状态存储在数据库中的概念是最好的。
    【解决方案2】:

    在服务器端,您可以将要发送给客户端的 ID 保存在数据库中,一旦发送响应,您就可以启动一个与该 ID 相关联的计时器。线程....线程将暂停2分钟,回来后会从数据库中检查状态,如果用户没有响应,则该线程将取消当前请求强>

    【讨论】:

    • 我忘了说数据库
    • 我仍然不确定该线程是个好主意。如果你有 1000 个请求怎么办——现在你已经产生了 1000 个线程。好像不经济。为什么不只保留一个带有过期信息的静态 ConcurrentDictionary 呢?
    • 当预订到期时,什么会从静态 ConcurrentDictionary 中清除预订?
    【解决方案3】:

    我在此链接中找到了适合我的案例的可接受解决方案

    WCF Service Application Timer

    第一个测试很有希望。感谢您花时间回答我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多