C# 为什么在RESTAPI中使用回调?

C# 为什么在RESTAPI中使用回调?,c#,rest,asynchronous,C#,Rest,Asynchronous,给定一个具有2个端点的REST API: 客户端: 对该端点的调用在代码中异步完成 服务器端: 收到请求后,启动一些异步任务。这个 然后,服务器使用 wait关键字。最后返回结果 客户端: 对该端点的调用在代码中异步完成 服务器端: 收到请求后,启动一些异步任务。服务器立即返回一个带有Id的结果,以标识操作。只要结果可用,服务器就会调用带有结果和Id的回调URL 为什么我需要第二种方法 对我来说,第一种方法似乎同样好。服务器使用wait关键字等待结果这一事实使它成为非阻塞的,因为关键字之后

给定一个具有2个端点的REST API:

客户端:

对该端点的调用在代码中异步完成

服务器端:

收到请求后,启动一些异步任务。这个 然后,服务器使用
wait
关键字。最后返回结果


客户端:

对该端点的调用在代码中异步完成

服务器端:

收到请求后,启动一些异步任务。服务器立即返回一个带有Id的结果,以标识操作。只要结果可用,服务器就会调用带有结果和Id的回调URL

为什么我需要第二种方法

对我来说,第一种方法似乎同样好。服务器使用
wait
关键字等待结果这一事实使它成为非阻塞的,因为关键字之后的所有内容都注册为延续。客户端也是非阻塞的,因为它是一个异步web请求


我确实意识到第二种方法可能很有用,如果它需要很长时间(+5分钟)。-然而,我忍不住觉得我错过了什么。

我可以看到更多的用法:

1) 非.net客户端可以很容易地使用第二种方法


2) 您希望处理不同URL上的回调(支付系统API中的常见做法)

我可以看到更多用法:

1) 非.net客户端可以很容易地使用第二种方法


2) 您希望处理不同URL上的回调(支付系统API中的常见做法)

我可以看到更多用法:

1) 非.net客户端可以很容易地使用第二种方法


2) 您希望处理不同URL上的回调(支付系统API中的常见做法)

我可以看到更多用法:

1) 非.net客户端可以很容易地使用第二种方法


2) 您希望处理不同URL上的回调(支付系统API中的常见做法)

好吧,第一种方法适用于不需要在服务器端扩展的
小型(er)操作。一个非常粗略的例子如下:

公共响应方法(inta,intb)
{
返回a+b;
}
这显然是你不能很好地扩展的东西,也是一个非常基本的操作,我将在你的第一个方法中介绍

现在,另一方面,如果您提供了一些功能,需要对巨大的DB之类的东西执行一些非常繁重的操作,而这些操作可能需要花费很长时间,那么您最好使用
回调方法。与简单得多的操作相比,复杂的操作往往会导致更多的错误,而简单得多的操作可以在服务器上进行不同的处理。例如,如果作为回调过程一部分的事务出错,服务器可以简单地重新启动整个过程,并且仍然会将结果通知用户

关于第二种方法,我想提一提:

我假设您将使用
ASP.NET
作为您的API,我目前还不是ASP.NET专家,但我非常确定,您不能在已经返回响应的请求中触发长时间运行的
任务,因为它们迟早会被
回收


但是,您可以使用某种类型的
MessageQueue
(如,…)来接收有关任务的消息,然后由大量灵活的客户端轻松处理。如果您需要扩展API以处理更多的用户,那么您只需在其中抛出更多侦听队列新消息的客户端,就基本完成了。

好的,第一种方法适用于不需要在服务器端扩展的
小(er)操作。一个非常粗略的例子如下:

公共响应方法(inta,intb)
{
返回a+b;
}
这显然是你不能很好地扩展的东西,也是一个非常基本的操作,我将在你的第一个方法中介绍

现在,另一方面,如果您提供了一些功能,需要对巨大的DB之类的东西执行一些非常繁重的操作,而这些操作可能需要花费很长时间,那么您最好使用
回调方法。与简单得多的操作相比,复杂的操作往往会导致更多的错误,而简单得多的操作可以在服务器上进行不同的处理。例如,如果作为回调过程一部分的事务出错,服务器可以简单地重新启动整个过程,并且仍然会将结果通知用户

关于第二种方法,我想提一提:

我假设您将使用
ASP.NET
作为您的API,我目前还不是ASP.NET专家,但我非常确定,您不能在已经返回响应的请求中触发长时间运行的
任务,因为它们迟早会被
回收


但是,您可以使用某种类型的
MessageQueue
(如,…)来接收有关任务的消息,然后由大量灵活的客户端轻松处理。如果您需要扩展API以处理更多的用户,那么您只需在其中抛出更多侦听队列新消息的客户端,就基本完成了。

好的,第一种方法适用于不需要在服务器端扩展的
小(er)操作。一个非常粗略的例子如下:

公共响应方法(inta,intb)
{
返回a+b;
}
这显然是你不能很好地扩展的东西,也是一个非常基本的操作,我将在你的第一个方法中介绍

另一方面,如果您提供了一些功能,需要在某些方面执行一些真正繁重的工作