2022年.NET创建SOAP服务:await/Task与ASMX不兼容问题咨询
问题解答
1. 能否让现有ASMX服务中的async/await代码直接运行?
ASMX是.NET平台下已被淘汰的传统Web服务技术,原生完全不支持基于Task的异步模式(TAP),直接编写返回Task的async WebMethod无法正常工作。
网上提到的IAsyncResult封装方案是.NET 2.0时代的老旧异步编程模型(APM),实现繁琐、调试维护成本极高,没有落地价值。
如果只是临时过渡、不想重构现有项目,可以用强制同步等待的临时方案绕开限制,但这种写法存在固有性能损耗和死锁风险,仅适合短期兼容使用:
[WebMethod] public GetProfileResponse GetClientProfile(Request request) { // 临时兼容写法,不推荐长期使用 var taskResult = new GetClientProfile().get(request.msisdn) .ConfigureAwait(false) .GetAwaiter() .GetResult(); GetProfileResponse getProfileResponse = new GetProfileResponse(); getProfileResponse.responseSuccess = taskResult.Item2.responseSuccess; getProfileResponse.responseDetails = "Here are some details"; getProfileResponse.subscriberClient = taskResult.Item2.clientName; return getProfileResponse; }
注意:不要直接用.Wait()或者.Result获取任务结果,ASP.NET旧版本同步上下文下这两种写法死锁概率极高,上述示例写法可降低死锁概率,但无法完全规避同步阻塞带来的线程池浪费问题。
2. .NET技术栈下原生支持async/await的现代SOAP服务方案
完全不需要在ASMX技术上死磕,微软早已提供成熟的替代方案,对外暴露的SOAP接口可以做到和原ASMX服务完全兼容,客户的POS终端无需任何修改即可正常调用:
- 如果项目继续使用.NET Framework 4.7.2技术栈,首选WCF(Windows Communication Foundation)
WCF是微软官方推出的ASMX替代技术,原生对SOAP协议提供完整支持,完美兼容async/await的Task异步写法。只要配置basicHttpBinding绑定,对外生成的WSDL和原ASMX服务几乎完全一致,旧客户端无感知。
最简服务实现示例:// 定义服务协定 [ServiceContract(Namespace = "www.business.com")] public interface IClientProfileService { [OperationContract] Task<GetProfileResponse> GetClientProfile(Request request); } // 服务实现,直接编写async/await逻辑即可 public class ClientProfileService : IClientProfileService { public async Task<GetProfileResponse> GetClientProfile(Request request) { GetProfileResponse getProfileResponse = new GetProfileResponse(); Tuple<bool, Plantilla> taskResult = await new GetClientProfile().get(request.msisdn); getProfileResponse.responseSuccess = taskResult.Item2.responseSuccess; getProfileResponse.responseDetails = "Here are some details"; getProfileResponse.subscriberClient = taskResult.Item2.clientName; return getProfileResponse; } } - 如果项目后续计划升级到.NET Core/.NET 6+跨平台版本,选择CoreWCF
CoreWCF是WCF的官方开源移植版本,在现代.NET平台上提供和WCF一致的SOAP服务能力,同样原生支持async/await写法,兼容标准SOAP协议和旧客户端,是当前微软官方推荐的SOAP服务开发方案。
ASMX技术已经停止功能更新超过15年,仅做最低限度的安全补丁维护,无论从开发效率、性能还是可维护性角度,都建议直接迁移到上述成熟方案,迁移成本极低,不需要修改客户端调用逻辑。
内容的提问来源于stack exchange,提问作者Felipe La Rotta
相关产品推荐
相关产品推荐

