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);
}
备注
- 尽量避免使用
Task.Result
,即使它已经等待。
- 带有 "Async".
的后缀异步方法(Task
或 Task<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);
}
我正在尝试使用异步 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);
}
备注
- 尽量避免使用
Task.Result
,即使它已经等待。 - 带有 "Async". 的后缀异步方法(
Task
或 Task<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);
}