Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自web api控制器的异步回调_C#_Asp.net Web Api - Fatal编程技术网

C# 来自web api控制器的异步回调

C# 来自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非常陌生,我需要实现一个不同寻常的模式。在我的控制器的Post方法中,它是获取一个包含回调URL的对象。然后它将立即向调用者返回HTTP响应。之后,它将使用第三方非现场API对该对象执行一些工作。完成该工作后,控制器将把该工作的结果发布到CallbackURL


然而,我不知道如何在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语境。