WebMethod 异步结果显示对象

WebMethod async Results Show Object

我正在尝试使用异步 return 结果,而不是 return 我想要的数据 return 整个对象

[System.Web.Services.WebMethod(BufferResponse=false)]
public static async Task<bool> getLogin(string username, string password)
{
    Login login = new Login();
    Task<bool> loginVerify = login.verifyLogin(username,password);
    await loginVerify;
    return loginVerify.Result;
}

public class Login
{
    public async Task<bool> verifyLogin(string username, string password)
    {
        return true;
    }
}

Firefox Firebug 的结果表明:

{"d":{"Result":true,"Id":2,"Exception":null,"Status":5,"IsCanceled":false,"IsCompleted":true,"CreationOptions":0,"AsyncState":null,"IsFaulted":false}}

为什么不直接显示结果?

我试过了运行

public static async Task<bool> getLogin(string username, string password)
{
    Login login = new Login();
    Task<bool> loginVerify = login.verifyLogin(username,password);
    await loginVerify;
    return false;
}

但 firebug 报告是一样的,除了它在 json

中说结果为假
{"d":{"Result":false,"Id":2,"Exception":null,"Status":5,"IsCanceled":false,"IsCompleted":true,"CreationOptions":0,"AsyncState":null,"IsFaulted":false}}

所以我的问题是为什么它显示整个对象而不是结果?

请在返回前将结果转换为 json it.You 可以使用任何 json 转换为

[System.Web.Services.WebMethod(BufferResponse=false)]
public static async Task<bool> getLogin(string username, string password)
{
    Login login = new Login();
    Task<bool> loginVerify = login.verifyLogin(username,password);
    await loginVerify;
    var result= new JavaScriptSerializer().Serialize(loginVerify.Result);
    return result;
}

这很简单,请考虑以下内容:

[System.Web.Services.WebMethod(BufferResponse=false)]
public static async Task<bool> getLogin(string username, string password)
{
    Login login = new Login();
    Task<bool> loginVerify = login.verifyLogin(username, password);
    return await loginVerify;
}

public class Login
{
    public async Task<bool> verifyLogin(string username, string password)
    {
        return true;
    }
}

当调用 getLogin 时,它将实例化 Login class 并调用 .verifyLogin 方法,此 return 是 Task<bool> -- 这意味着它是 "awaitable"。当你 await 它时,你会得到 boolean 结果值。

这可以简化为 return Task<bool> 批发,因为有一个 Task 有问题。将 Task 视为单个异步操作并 return 它——允许消费者 await 它:

[System.Web.Services.WebMethod(BufferResponse=false)]
public static Task<bool> getLogin(string username, string password)
{
    Login login = new Login();
    return login.verifyLogin(username, password);
}

async Task FooBar()
{
    boolean isLoggedIn = await _loginService.getLogin(this.Username, this.Password);
}

备注

  1. 尽量避免使用 Task.Result,即使它已经等待。
  2. 带有 "Async".
  3. 的后缀异步方法(TaskTask<T> returning)

this answer 中所述,WebMethod 不支持 async-await(它支持另一种异步模式 APM,您可以将 async-await到APM,但是很别扭)。

那你为什么会得到这么奇怪的结果呢? WebMethod 不知道 Task 是某种特殊类型,因此它通过访问和序列化其属性将其视为常规对象。这包括 Result,同步 returns Task 的结果。这也意味着代码实际上不是异步的。

我知道我来晚了,但只是想分享一个解决方案。 在 Javascript 中,我们可以使用 response.d.Result 从 C# 中获取实际的字符串。 例如:

success: function (response) {
                    var gJson = eval(response.d.Result);
                    console.log(gJson);
}