. net core 3 web api controller - выполнение кода после отправки ответа - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть проект. net core 3.1 webapi. В некоторых контроллерах мне нужно выполнить некоторый код, который не влияет на ответ клиенту.

В частности, у меня есть метод, который возвращает json с информацией профиля, которая вызывается при посещении пользователем страницы этого профиля. После получения информации профиля мне нужно зарегистрировать, что пользователь посещает эту страницу, но для более быстрого ответа я хочу вернуть ответ до этой операции журнала.

[Route("[controller]")]
[ApiController]
public class ProfilesController : ControllerBase
    {
        [HttpGet("{id}")]
        public async Task<ActionResult<Profile>> GetProfileById([FromRoute] int id)
        {
             Profile profile = await _profileService.GetByIDAsync(id);

             // DO THIS OPERATION IN BACKGROUND AND DON'T WAIT TO RETURN RESPONSE
              await _logService.LogProfileVisit(id);

             return Ok(profile);
        }
}

Как я могу это сделать?

Спасибо.

Ответы [ 4 ]

2 голосов
/ 04 апреля 2020

Удалить await ключевое слово перед _logService.LogProfileVisit(id);

Это не позволит вам ждать ответа

[Route("[controller]")]
[ApiController]
public class ProfilesController : ControllerBase
{
    [HttpGet("{id}")]
    public async Task<ActionResult<Profile>> GetProfileById([FromRoute] int id)
    {
        _logService.LogProfileVisit(id);
        Profile profile = await _profileService.GetByIDAsync(id);
        return Ok(profile);
    }
}
0 голосов
/ 04 апреля 2020

Вы можете использовать HangFire или Кварцевый планировщик для запуска задачи в фоновом режиме без ожидания ответа.

Пример использования HangFire:

var jobId = BackgroundJob.Enqueue(
    () => _logService.LogProfileVisit(id));
0 голосов
/ 04 апреля 2020

Вы можете использовать много подходов, но для этого не существует однострочного решения. Вы можете использовать фоновых работников, чтобы добиться этого. «Служба Bakcground с размещенной службой в. NET Core» может удовлетворить ваши потребности. Вы также можете использовать библиотеку типа Hangfire для легко настраиваемых сложных решений.

0 голосов
/ 04 апреля 2020

Вы можете сделать это с фильтром, например. Читайте здесь

...