【问题标题】:Call async method from ASP.NET validator handler从 ASP.NET 验证器处理程序调用异步方法
【发布时间】:2015-08-11 08:10:01
【问题描述】:

我知道如何在 ASP.NET 应用程序example Async-ASP.NET 中使用异步方法。

现在我需要在ServerValidate 事件上调用CustomValidator 中的网络服务,并由服务结果决定值是否有效。服务方法是异步的,我不确定如何处理。如果我使用 async void 事件处理程序,验证将无法正常工作,因为在验证不成功的情况下不会显示验证消息。似乎 await 不等待 Web 服务的结果,ASP.NET 也不等待验证器发送响应。

解决这个问题的正确方法是什么?或者如何在验证器事件处理程序中使用RegisterAsyncTask?页面设置为Async="true"

我的一段代码:

protected async void cvWorkplace_ServerValidate(object sender, ServerValidateEventArgs e)
{    
    // do test call to sap
    var testResult = await PerformLabelServiceTestCallAsync(materialId, ddPlant.SelectedValue, workplaceName, UsersLanguage);

    if (testResult.HasError)
    {
        e.IsValid = false;

        // other stuff
        // ...
    }
    else
    {
        e.IsValid = true;
    }
}

【问题讨论】:

    标签: asp.net async-await


    【解决方案1】:

    这将立即返回,调用代码将在 cvWorkplace_ServerValidate 设置之前评估 e.IsValid

    RegisterAsyncTaskPage 类的方法,它是您页面的基类,您可以从cvWorkplace_ServerValidate 方法调用它,这是您页面的一个方法。

    但是,即使你注册了一个异步任务,你也不会在cvWorkplace_ServerValidate方法中得到结果。

    最好的方法是注册一个异步任务,在你的页面类中设置一个字段并相应地呈现。

    【讨论】:

    • 是的,这就是我正在考虑的解决方案。但在我的情况下,实现起来太昂贵了,所以我选择了同步调用 Web 服务。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 2011-11-01
    • 1970-01-01
    • 2012-01-08
    • 2016-09-06
    • 1970-01-01
    • 2019-04-04
    相关资源
    最近更新 更多