我是Web API的新手,我需要实现一个不寻常的模式。在我的控制器的Post方法中,它是一个包含CallbackURL的对象。然后它会立即向调用者返回HTTP响应。之后,它将使用第三方异地API来执行对象的一些工作。完成该工作后,控制器将把该工作的结果发布到CallbackURL。
但是,我不知道如何在Web API中实现它。一旦我返回HTTP响应,控制器的生命周期就结束了,对吗?如果是这样,我如何在返回响应后执行我需要做的工作?
答案 0 :(得分:4)
如果您只需要将结果发布到网址而不是发布呼叫的客户端,您可以做一些简单的事情:
public string MyAPIMethod(object input)
{
Task.Factory.StartNew(() =>
{
//call third-party service and post result to callback url here.
});
return "Success!";
}
api调用将立即返回,您创建的任务将继续在另一个线程中处理。
答案 1 :(得分:3)
创建任务以完成请求(如上面的Jason P所建议的)很可能解决问题,提供了线程安全性。但是,如果调用第三方API需要花费大量时间来完成和/或您期望许多并发客户端,那么这种方法可能会损害Web服务的性能。如果是这种情况,您的问题似乎是称为“请求/确认/回调”(也称为“请求/确认/中继”)的服务模式的完美候选者。使用该模式,您的Web API方法只会将每个请求(包括回调URL)存储到队列/数据库中并快速返回。一个单独的模块(可能在多台机器上运行,具体取决于任务的数量和复杂性)将负责完成任务,并随后通过回调URL通知完成(请参阅http://servicedesignpatterns.com/ClientServiceInteractions/RequestAcknowledge)。
答案 2 :(得分:2)
这是假设您要将第三方查询的结果返回给来电者。
你是对的,这超出了WebAPI的可能范围。返回HTTP响应后,客户端也没有与服务器的连接。
你应该研究Asp.Net SignalR,它允许客户端和服务器之间的持久连接,在现代浏览器中工作,甚至回到IE7(虽然官方不支持),以及支持非浏览器客户端。
然后你可以做一些事情,所有这些都需要客户端先连接到SignalR。
选项1:您可以调用WebApi控制器,该控制器可以返回,但不能在启动任务之前调用。此任务可以查询第三方api,然后通过SignalR调用调用者的函数以及您要提供的结果。
选项2:您可以调用SignalR Hub操作,该操作可以与您的客户端通话。您可以告诉客户立即响应,查询第三方API,然后返回您想要提供的结果。