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

本文关键字:执行 操作 其他 WebAPI 客户端 返回值 应用程序 | 更新日期: 2023-09-27 18:00:30

我有一个在下的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将独立工作(尽管当前的实现不是这样的,但我们必须这样做)。可以看出,我不能在这里使用返回语句

我该怎么做?

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

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

[HttpPost]
[Route("AddSubProduct")]
public string InsertSubProduct(SubProduct subproduct)
{
    subProductRepository.InsertSubProduct(subproduct);
    HostingEnvironment.QueueBackgroundWorkItem(cancellationToken =>
                                               DoSomethingElse(subproduct));
    return subproduct.ToString();
}

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

旁注-不要捕捉无法处理的异常。特别是,不要使用throw ex,你会失去堆栈竞争。