如何解决NSwag生成的API客户端在.NET Framework ASMX中抛出空引用异常问题
问题原因
这个空引用异常是.NET Framework下ASMX服务的异步上下文兼容性问题导致的:
- ASMX服务基于旧版ASP.NET runtime设计,对async/await的异步上下文支持存在缺陷
- 你使用的NSwag生成代码中所有异步调用都加了
ConfigureAwait(false),会丢弃原始的ASP.NET同步上下文,当异常需要从线程池线程抛回原始ASMX请求上下文时,System.Web.ThreadContext无法找到关联的实例,就会抛出空引用异常。
解决方案
方案1:修改NSwag生成配置(推荐)
重新生成NSwag客户端时,关闭生成ConfigureAwait(false)的选项:
在NSwag的生成配置(nswag.json文件或者生成命令参数)中,将ConfigureAwait参数设置为true,或者直接关闭该配置项,生成的代码就不会带ConfigureAwait(false),会默认保留原始同步上下文,避免上下文丢失。
方案2:同步调用异步方法
ASMX服务对异步支持有限,直接将异步调用转为同步调用可以彻底避开异步上下文问题:
调用RetrieveAsync时不用await,改为:
var result = RetrieveAsync(someIdentifier, includePermissibleActions).GetAwaiter().GetResult();
这种方式会阻塞当前线程等待异步执行完成,异常会直接抛出不会被包装为AggregateException,完全匹配ASMX的同步处理逻辑。
方案3:调整web.config配置
确保你的web.config中已经配置了正确的运行时版本,启用ASP.NET异步支持:
<system.web> <compilation targetFramework="4.7.2" /> <!-- 替换为你实际使用的.NET Framework版本 --> <httpRuntime targetFramework="4.7.2" /> </system.web>
内容的提问来源于stack exchange,提问作者AmFearLiathMor
相关产品推荐
相关产品推荐

