如何从WebAPI向客户端应用程序返回值,但同时需要执行其他操作?

时间:2015-06-30 05:48:09

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

我有

下的WebAPI方法
[HttpPost]
[Route("AddSubProduct")]
public string InsertSubProduct(SubProduct subproduct)
{
   try
   {
      subProductRepository.InsertSubProduct(subproduct);

      // This message must be returned to the client application as soon
      // as the product is created
      subproduct.ToString();

      // This will happen parallely 
      DoSomethingElse(subproduct);
   }
   catch (Exception ex)
   {
      throw ex;
   }
}

可以看出,subproduct.Tostring()将首先立即发送到客户端应用程序(一旦创建产品), DoSomethingElse 将独立工作(尽管当前的实现是不是那样的,我们必须这样做)。可以想象我不能在这里使用 return语句

我将如何做到这一点?

1 个答案:

答案 0 :(得分:1)

您需要在后台线程上排队工作。如果您使用的是.NET 4.5.2,我建议您使用HostingEnvironment.QueueBackgroundWorkItem。如果您使用的是先前版本,请使用BackgroundTaskManager。两者都将使用ASP.NET运行时注册他们的工作:

[HttpPost]
[Route("AddSubProduct")]
public string InsertSubProduct(SubProduct subproduct)
{
    subProductRepository.InsertSubProduct(subproduct);

    HostingEnvironment.QueueBackgroundWorkItem(cancellationToken =>
                                               DoSomethingElse(subproduct));
    return subproduct.ToString();
}

如果您经常使用并发请求进行此操作,则应考虑排队并让单个线程出列并处理它们。如果持久性在这里很重要,那么您需要选择不同的路线。

附注 - 不要捕捉您无法处理的异常。特别是,不要使用throw ex,你就会失去堆栈跟踪。