.NET WebService服务端异步调用:如何让客户端返回String类型
解决.NET ASMX WebService异步方法调用返回TaskOfString的问题
问题原因
传统ASMX WebService的客户端代理生成逻辑,会将服务端定义的async Task<string>异步方法包装为包含结果对象的响应类型(即对应TaskOfString的响应结构),而非直接返回Task<string>,这是ASMX代理对异步方法的默认处理规则。
解决方案
1. 直接提取结果属性
你当前的代码已经可以获取到string类型的返回值,res.Body.ConnectAsyncTestResult就是最终的字符串结果:
CWebServiceSoapClient client = new CWebServiceSoapClient(); var res = await client.ConnectAsyncTestAsync(); string result = res.Body.ConnectAsyncTestResult; // 此处已为string类型
2. 封装扩展方法简化调用
如果觉得每次提取属性的操作繁琐,可以封装一个扩展方法,直接返回string类型:
public static class WebServiceClientExtensions { public static async Task<string> ConnectAsyncTest(this CWebServiceSoapClient client) { var response = await client.ConnectAsyncTestAsync(); return response.Body.ConnectAsyncTestResult; } }
之后客户端调用可简化为:
CWebServiceSoapClient client = new CWebServiceSoapClient(); string result = await client.ConnectAsyncTest();
3. 重新生成代理时调整异步模式
若尚未生成客户端代理,或可重新生成代理,可通过以下步骤调整:
- 右键项目中的服务引用,选择配置服务引用
- 在弹出窗口的异步操作选项中,选择生成基于Task的操作
- 点击确定后重新生成代理,此时生成的异步方法会直接返回
Task<string>,无需再从响应对象中提取结果
内容的提问来源于stack exchange,提问作者韩先生
相关产品推荐
相关产品推荐

