我有一个最近的经验,我想分享这可能对任何必须维护必须更新以调用基于任务的方法的旧ASMX Web服务的人有所帮助.
我最近一直在更新一个ASP.NET 2.0项目,其中包括一个传统的ASMX Web服务到ASP.NET 4.5.作为更新的一部分,我介绍了一个Web API接口,以允许应用程序的高级自动化.ASMX服务必须与新API共存才能实现向后兼容.
该应用程序的一个功能是能够代表呼叫者从外部数据源(工业工厂历史记录,定制Web服务等)请求数据.作为升级的一部分,我重新编写了数据访问层的大部分内容,以使用基于任务的异步模式异步请求数据.鉴于在ASMX服务中不可能使用aync/await,我修改了ASMX方法以对异步方法进行阻塞调用,即调用基于任务的方法,然后使用Task.WaitAll阻塞线程,直到任务完成.
当调用任何正在调用返回任务或任务<T>的方法的ASMX方法时,我发现请求总是超时.当我逐步完成代码时,我可以看到异步代码已成功执行,但对Task.WaitAll的调用从未检测到任务已完成.
这引起了一个令人头痛的问题:ASMX服务如何能够与新的异步数据访问功能共存?
我想弄明白,但现在没有成功.是否可以在webmethod asmx服务中使用async/await?到目前为止我发现async/await只能在WCF服务方法中使用(休息或其他).
我正在尝试使用 async 返回结果,但我希望它返回整个对象而不是返回数据
[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;
}
}
Run Code Online (Sandbox Code Playgroud)
Firefox Firebug 的结果显示:
{"d":{"Result":true,"Id":2,"Exception":null,"Status":5,"IsCanceled":false,"IsCompleted":true,"CreationOptions":0,"AsyncState":null,"IsFaulted":false}}
Run Code Online (Sandbox Code Playgroud)
为什么不只是显示结果?
我试过跑步
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;
}
Run Code Online (Sandbox Code Playgroud)
但是萤火虫报告是相同的,只是它在 json 中说 Result false
{"d":{"Result":false,"Id":2,"Exception":null,"Status":5,"IsCanceled":false,"IsCompleted":true,"CreationOptions":0,"AsyncState":null,"IsFaulted":false}}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是为什么它显示整个对象而不是结果?