как вызвать метод асинхронного контроллера MVC из AJAX - PullRequest
0 голосов
/ 13 марта 2019

У меня есть метод контроллера, который выполняет поиск в БД для пользователя, который вошел в систему, затем он отправит электронное письмо с подтверждением, похожее на это:

[HttpPost]
public async void ResendConfirmationEmail(string username)
{
    var user = await Usermanager.FindByNameAsync(username);
    try { SendRegistrationEmail(user); }
    catch (Exception e)
    {
        //TODO: LOGGIN EMAIL ERROR
        throw e;
    }
}

Я хочу вызвать это из ajaxфункция как это:

var ResendRegEmail = function (identity) {
    $.ajax({
        type: "POST",
        url: "/Customer/ResendConfirmationEmail",
        data: { username: identity },
        success: function (data) {
            $("#ResendModal").modal('show');
            $("#msgSuccess").html("Email has been sent succesfully please check your email.");
        },
        error: function (request, textStatus, errorThrown) {
            $("#ResendModal").modal('show');
            $("#msgError").html(textStatus + "   " + errorThrown);
        }
    })
}
[AllowAnonymous]
public async void SendRegistrationEmail(JustAskUser user)
{ code here }

, если я удаляю асинхронную работу, функция resendCOnfirmationEmail работает должным образом, но бизнес-требование использует асинхронную синхронизацию, чтобы поддерживать поток сайта как можно быстрее.,В настоящее время получение ресурса не загружается 500 ошибка

, но затем я получаю сообщение об ошибке от "sendregistrationEmail" - {"Асинхронная операция не может быть запущена в настоящее время. Асинхронные операции могут быть запущены только в пределах асинхронного обработчика или модуля иливо время определенных событий в жизненном цикле страницы. Если это исключение произошло во время выполнения страницы, убедитесь, что страница помечена как <% @ Page Async = \ "true \"%>. Это исключение также может указывать на попытку вызвать асинхронную операцию \ ".void \ "метод, который обычно не поддерживается при обработке запросов ASP.NET. Вместо этого асинхронный метод должен возвращать задачу, а вызывающая сторона должна ожидать ее."}

1 Ответ

1 голос
/ 14 марта 2019

Я считаю, что ваша проблема - это линия, по которой вы звоните SendRegistrationEmail. Поскольку этот метод асинхронный, перед именем метода должно быть ключевое слово await.

Сообщение об ошибке содержит решение, как указано.

... Вместо этого асинхронный метод должен возвращать задачу, а вызывающая сторона должна ждать ее

Таким образом, ваш метод должен быть изменен так:

[HttpPost]
public async void ResendConfirmationEmail(string username)
{
    var user = await Usermanager.FindByNameAsync(username);
    try 
    { 
        await SendRegistrationEmail(user); 
    }
    catch (Exception e)
    {
        //TODO: LOGGIN EMAIL ERROR
        throw e;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...