如何从Ajax调用异步MVC控制器方法

时间:2019-03-13 20:33:25

标签: javascript ajax asynchronous model-view-controller

我有一个控制器方法,该方法为登录的用户执行数据库查找,然后它将发送一封确认电子邮件,如下所示:

[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”中收到错误消息-{“目前无法启动异步操作。异步操作只能在异步处理程序或模块内或在页面生命周期中的某些事件期间启动。如果发生此异常执行页面时发生错误,请确保该页面被标记为<%@页面Async = \“ true \”%>。此异常也可能表示尝试调用\“ async void \”方法,这在ASP中通常不受支持.NET请求处理。相反,异步方法应返回一个Task,而调用者应等待它。“}

1 个答案:

答案 0 :(得分:1)

我认为您的问题就是致电SendRegistrationEmail的那一行。由于此方法是异步方法,因此您应该在方法名称之前使用await关键字。

错误消息包含上述解决方案。

  

...相反,异步方法应返回一个Task,而调用者应等待它

因此,您的方法应该像这样修改:

[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;
    }
}