Элегантный способ предоставить дополнительные синхронные методы в API? - PullRequest
0 голосов
/ 01 июня 2018

Я написал веб-API безопасности, и все методы уровня контроллера являются асинхронными.Я думал, что нижестоящие клиенты могут просто «ждать» методы синхронной обработки по мере необходимости.

Однако я столкнулся со сценарием, в котором AuthorizationAttribute в ASP.NET MVC (pre-core) не поддерживает перехваты асинхронных методов.Поэтому мне нужна возможность предоставить дополнительную синхронную версию некоторых из этих методов.

Каким будет элегантный способ сделать это?Например, предположим, что у меня в настоящее время определен следующий маршрут для получения пользователя:

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 голосов
/ 01 июня 2018

Я думаю, вы не понимаете, что такое на самом деле async методы контроллера.async и await не влияют на сам API, только на реализацию.

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

Когда вы реализуете обработчик действий асинхронно, это означает, что платформа Web API может использовать поток, обрабатывающий запрос длядругая работа, в то время как это await результат асинхронных операций (например, запрос вашей базы данных).Это помогает масштабировать ваш сервис, увеличивая нагрузку, которую он может обрабатывать на том же оборудовании.

Это не оказывает никакого влияния на абонента .Для вашего HTTP-клиента запрос выглядит одинаково независимо от того, обрабатывается он синхронно или нет.По-прежнему поступает HTTP-запрос и HTTP-ответ возвращается по тому же соединению с сокетом.

Теперь, если ваш клиент использует асинхронные вызовы вашего API, он может отказаться от потока, который выполняет вызов.пока ваш сервис обрабатывает запрос и выдает ответ.Это может быть полезно, если клиент сам является службой HTTP или приложением с насосом сообщений.

Но в любом случае он вызвал бы API на той же конечной точке независимо от того, реализован ли API с использованием методов async или нет.

...