繁体   English   中英

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

[英]how to call an async MVC controller method from ajax

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

[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 \\”%>。此异常也可能表示尝试调用\\“ async void \\”方法,ASP.NET请求通常不支持该方法相反,异步方法应该返回一个Task,而调用者应该等待它。“}

我相信您的问题是您致电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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM