C# 来自web api控制器的异步回调
我对Web API非常陌生,我需要实现一个不同寻常的模式。在我的控制器的Post方法中,它是获取一个包含回调URL的对象。然后它将立即向调用者返回HTTP响应。之后,它将使用第三方非现场API对该对象执行一些工作。完成该工作后,控制器将把该工作的结果发布到CallbackURLC# 来自web api控制器的异步回调,c#,asp.net-web-api,C#,Asp.net Web Api,我对Web API非常陌生,我需要实现一个不同寻常的模式。在我的控制器的Post方法中,它是获取一个包含回调URL的对象。然后它将立即向调用者返回HTTP响应。之后,它将使用第三方非现场API对该对象执行一些工作。完成该工作后,控制器将把该工作的结果发布到CallbackURL 然而,我不知道如何在Web API中实现这一点。一旦我返回HTTP响应,控制器的生命周期就结束了,对吗?如果是,在返回响应后,我如何执行需要执行的工作?这是假定您希望将第三方查询的结果返回给调用方。 你是对的,这超出了W
然而,我不知道如何在Web API中实现这一点。一旦我返回HTTP响应,控制器的生命周期就结束了,对吗?如果是,在返回响应后,我如何执行需要执行的工作?这是假定您希望将第三方查询的结果返回给调用方。 你是对的,这超出了WebAPI的可能范围。返回HTTP响应后,客户端也没有与服务器的连接 您应该研究Asp.Net Signal,它允许客户端和服务器之间的持久连接,在现代浏览器中工作,甚至可以回到IE7(尽管官方不支持),以及支持非浏览器客户端 然后,您可以做一些事情,所有这些都需要客户端首先连接到signar 选项1:您可以调用WebApi控制器,该控制器可以返回,但不能在启动任务之前返回。此任务可以查询第三方api,然后通过信号器调用调用方上的函数,并提供您想要提供的结果
选项2:您可以调用SignalR Hub action,它可以与您的客户进行对话。您可以告诉您的客户端即时响应,查询第三方api,然后返回您想要提供的结果。如果您只需要将结果发布到url,而不需要发布到发起调用的客户端,您可以简单地执行以下操作:
public string MyAPIMethod(object input)
{
Task.Factory.StartNew(() =>
{
//call third-party service and post result to callback url here.
});
return "Success!";
}
api调用将立即返回,您创建的任务将在另一个线程中继续处理。创建任务以完成请求(如上面Jason p所建议的)很可能会解决问题,提供了线程安全性。但是,如果对第三方API的调用需要花费大量时间才能完成和/或您需要许多并发客户端,那么这种方法可能会损害Web服务的性能。如果是这样的话,您的问题似乎是一种称为“请求/确认/回调”(也称为“请求/确认/中继”)的服务模式的完美候选。使用该模式,您的WebAPI方法只需将每个请求(包括回调URL)存储到队列/数据库中,并快速返回。一个单独的模块(可能在多台机器上运行,具体取决于任务的数量和复杂性)将负责完成任务,并随后通过回调URL通知完成(请参阅) 多谢各位。我相信这就是我所需要的。然而,在实现它之后,我注意到每当同时发出多个请求时就会发生崩溃。崩溃的问题似乎几乎是随机的:不应该为null的各种对象都是null,而且它们从来都不是相同的对象。你知道为什么开始这样的任务会导致这样的结果吗?或者,让我问一下,在一个API上使用这个方法是否安全,因为这个API可能会同时遇到大量的请求?这取决于任务中的代码是否是线程安全的。需要避免所有多线程陷阱。特别要考虑的是,您将无法访问任务线程内的HTTP语境。