使.net web api队列请求运行'单线程'

时间:2015-07-20 15:21:16

标签: .net asp.net-web-api

我们有一个c#.net Web API服务调用代码,该代码一次无法处理多个数据库请求。该系统用于在线支付需求相对较小的账单。

我们无法控制代码进行更改以解决问题。使用相同代码的另一个组使用WCF API和服务配置将并发请求限制为1,从而有效地解决了问题。我们现在必须在WCF中重写或弄清楚如何使Web API工作。

是否有办法让Web API对请求进行排队并一次处理一个请求,同时仍然保持实时操作'对于最终用户?

对不起,如果这个含糊不清,我代表实际的程序员请求协助。

1 个答案:

答案 0 :(得分:1)

我唯一知道的是“自己动手”。 I.E. :

  • 将您提供请求的部分移动到某个共享组件(如果您还没有这样的话)
  • 在持久存储(db,cloud ...)中创建用于排队操作的表,在那里存储传入请求(应该很容易,因为请求必须以某种方式可序列化 - 我选择xml用于持久存储)< / LI>
  • 更改您的服务,而不是处理请求,它只会验证请求&amp;将请求存储到持久存储(db)并返回
  • 创建用于异步处理请求的新程序集(通常是Windows服务器上的窗口服务),它将从持久存储(db)中获取请求,处理它们并记录失败

或者,您可以更改服务以使用fire&amp;忘记带有“锁定”语句的模式以限制对付款部分的访问 - 例如:

private static object s_SyncRoot = new object();

...
new Task(() =>
{
  lock (s_SyncRoot)
  {
    // process payment - single thread
  }
}).Start();
return "ok";
...

哪个快速&amp;易于实现 - 但是你牺牲了可靠性 - 例如参见Fire and Forget with ASP.NET MVC。它也不能很好地扩展(如果会有一些请求,你会打开太多并行线程,它可以有效地删除你的API服务