ASP.NET Core 6调用SOAP服务触发空引用异常的排查与解决
问题原因及解决方法
问题原因
空引用异常的直接原因是:创建QUERYEMPLOYEE_HRM_BODY实例后,它的OPR属性并未自动初始化(默认值为null),直接尝试访问OPR.EMP和OPR.DEP时,触发了NullReferenceException。
解决方法
在给OPR的子属性赋值前,先实例化OPR对应的类型(类型名由WCF Connected Service根据WSDL生成,通常为类似QUERYEMPLOYEE_OPR的命名):
修正后的实现类代码
public class EmployeeService : IEmployeeService { private readonly HrmServiceServiceClient _client; // 修正构造函数名称,与类名保持一致 public EmployeeService(HrmServiceServiceClient client) { _client = client; } public async Task<EmployeeResponse> GetEmployeeDetailAsync(EmployeeDto model) { var request = new QUERYEMPLOYEE_REQ(); request.HRM_HEADER = new HRM_HEADERType(); request.HRM_HEADER.USERNAME = "HRMUSN"; request.HRM_HEADER.PASSWORD = "HRMPSW"; request.HRM_BODY = new QUERYEMPLOYEE_HRM_BODY(); // 关键:先实例化OPR对象 request.HRM_BODY.OPR = new QUERYEMPLOYEE_OPR(); request.HRM_BODY.OPR.EMP = model.EmployeeCode; request.HRM_BODY.OPR.DEP = model.DepartmentCode; var response = await _client.QueryEmployeeAsync(request); return response; } }
额外代码修正点
除空引用问题外,代码还有两处需修正的语法/逻辑问题:
控制器构造函数参数未命名:
原构造函数缺少参数名称,编译会报错,修正后:public EmployeeController(IEmployeeService employeeDetailService) { _employeeDetailService = employeeDetailService; }(注意:需统一接口名称,原代码中实现类继承
IEmployeeService,但控制器注入IEmployeeDetailService,二者需保持一致,要么修改接口名,要么调整注入类型)实现类构造函数名称错误:
原实现类构造函数名为EmployeeDetailService,但类名是EmployeeService,必须保持一致才能正常依赖注入。
内容的提问来源于stack exchange,提问作者Bami
相关产品推荐
相关产品推荐

