优雅的方式在api中提供可选的同步方法?

时间:2018-05-31 22:48:50

标签: c# .net rest asp.net-web-api asp.net-web-api2

我编写了一个安全Web API,所有控制器级方法都是异步的。我的想法是,下游客户可以简单地等待"等待"根据需要进行同步处理的方法。

但是,我遇到过ASP.NET MVC(pre-core)中的AuthorizationAttribute不支持异步方法挂钩的情况。所以我需要能够提供其中一些方法的可选同步版本。

这样做的优雅方式是什么?例如,让我们说我目前定义了以下路由来获取用户:

api/v1/users/{userGuid}

这是方法签名:

public async Task<IHttpActionResult> GetUserAsync(Guid id, [FromUri] string expand=null)

如何更新我的API以提供此方法的同步版本?似乎我需要更新uri来适应这个:

api/v1/users/{userGuid}/synchronous

否则,我还能如何识别和处理特定API方法的同步版本的请求?

1 个答案:

答案 0 :(得分:2)

我认为你对async控制器方法究竟是什么感到困惑。 asyncawait不会影响API本身,只影响实现。

public async Task<IHttpActionResult> GetUserAsync(Guid id, [FromUri] string expand=null)

当您异步实现动作处理程序时,这意味着Web API框架可以使用处理请求的线程来执行其他工作,同时await异步操作的结果(例如,查询数据库)。这有助于通过增加可在同一硬件上处理的请求负载来扩展您的服务。

它对来电者没有任何影响。对于您的HTTP客户端,无论是否同步处理,请求看起来都是一样的。仍然有HTTP请求进入,并且HTTP响应通过同一套接字连接返回。

现在,如果您的客户端正在使用对API的异步调用,它可能会在您的服务处理请求并生成响应时放弃正在进行调用的线程。如果客户端本身是HTTP服务,或者是带有消息泵的应用程序,这可能很有用。

但无论如何,无论是否使用async方法实现API,它都会在同一端点上调用API。