WebMethod异步结果显示对象

时间:2016-05-04 23:35:32

标签: c# jquery async-await webmethod

我试图使用异步返回结果,但不是返回我想要的数据,而是返回整个对象

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

但是萤火虫报告是相同的,除了它在json中说结果为假

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

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

4 个答案:

答案 0 :(得分:4)

正如this answer中所述,WebMethod不支持async - await(它支持另一种异步模式,APM,您可以转换async - await到APM,但这很尴尬。)

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

答案 1 :(得分:0)

请在返回之前将结果转换为json。您可以使用任何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;
}

答案 2 :(得分:0)

这很简单,请考虑以下事项:

[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类并调用.verifyLogin方法,这会返回Task<bool> - 这意味着它会&#39} #34; awaitable&#34 ;.当您await时,您将获得boolean结果值。

这可以简化为返回Task<bool>批发,因为有一个Task有问题。将Task视为单个异步操作并将其返回 - 允许消费者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. 后缀异步方法(TaskTask<T>返回)与&#34; Async&#34;。

答案 3 :(得分:0)

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

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