我试图使用异步返回结果,但不是返回我想要的数据,而是返回整个对象
[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}}
所以我的问题是为什么它会显示整个对象而不仅仅是结果?
答案 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);
}
备注强>
Task.Result
。Task
或Task<T>
返回)与&#34; Async&#34;。答案 3 :(得分:0)
我知道我迟到了,但只想分享一个解决方案。 在Javascript中,我们可以使用response.d.Result从c#获取实际字符串。 例如:
success: function (response) {
var gJson = eval(response.d.Result);
console.log(gJson);
}