如何在ASP.NET MVC 3站点中执行后台作业?

Art*_*lov 6 c# asp.net-mvc asp.net-mvc-3

我目前正在开发一个电子商务网站,有一个功能我不太确定如何实现.大多数情况下,您只需将产品添加到购物车并购买,这可能是最简单的工作流程.我问的是有点不同,如果购买产品有时间限制怎么办?我的意思是一些网站给你一个确切的时间限制购买产品(如足球经理),在那些你不能永远持有产品的网站,它有15分钟的限制,如果你不买在那个时期,项目将从您的购物车中释放.(而且很可能其他人会跳上它)

现在,作为ASP.NET MVC程序员,我喜欢实现这个功能,但正如我所说,我不知道该怎么做.我想当我将物品添加到购物车时我需要保留时间(类似于ItemAddedAt),我需要在x分钟内释放该物品,因此需要在x分钟后运行以释放该产品.在全球范围内思考,我想我需要一项服务,当我添加一个项目时,我还需要订阅这个服务,服务在后台运行一个计时器/工作.我不知道/没有经验的是这部分,如何在ASP.NET MVC项目中做到这一点,是否有样本项目,文章,库或类似的东西?

当然我不知道我的逻辑是否适合这个问题,我需要一些指导,如果可能的话,可以使用一些源代码.

sal*_*iza 4

AFAIK 在 MVC 项目中没有声明/编程任务的标准方法。完成您想要的任务的推荐方法是在您的解决方案中创建一个新的控制台应用程序项目,并使用 Windows 任务计划程序每 X 分钟执行一次,释放任何购物车中超过 X 分钟的任何产品。

为此,您需要从新项目引用您的 MVC 项目(以访问所有模型),或者更好的是,创建一个类库项目,将您的模型/数据库类移至那里,然后从MVC 和控制台项目。


话虽如此,实际上有一个小“hack”可用于在 MVC 项目中获取编程任务。您可以使用以下代码:

HttpContext.Current.Cache.Add("Task", "1", null, 
            DateTime.MaxValue, TimeSpan.FromMinutes(5), 
            CacheItemPriority.Normal, new CacheItemRemovedCallback(CheckCarts));
Run Code Online (Sandbox Code Playgroud)

例如,可以从 Global.asax 调用该行,将向缓存添加“任务”条目。存储的值(“1”)并不重要,重要的是缓存条目将在五分钟后过期,并且当过期时,调用“CheckCarts”方法(在 Global.asax 中定义,或者在您执行的类中定义)这段代码)。

public void CheckCarts(string key, object value, CacheItemRemovedReason reason) {
     // Insert your code here to check for expired carts
     (...)

     // We add the entry again to the cache, so that this method will be called again in 5 minutes.
     HttpContext.Current.Cache.Add("Task", "1", null, 
            DateTime.MaxValue, TimeSpan.FromMinutes(5), 
            CacheItemPriority.Normal, new CacheItemRemovedCallback(CheckCarts));
}
Run Code Online (Sandbox Code Playgroud)

当缓存过期时,会调用 CheckCarts 方法,您的代码会执行它必须执行的任何操作,最后再次将自身添加到缓存中,并在另外 5 分钟后调用。