You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
    }
}

额外代码修正点

除空引用问题外,代码还有两处需修正的语法/逻辑问题:

  1. 控制器构造函数参数未命名:
    原构造函数缺少参数名称,编译会报错,修正后:

    public EmployeeController(IEmployeeService employeeDetailService)
    {
        _employeeDetailService = employeeDetailService;
    }
    

    (注意:需统一接口名称,原代码中实现类继承IEmployeeService,但控制器注入IEmployeeDetailService,二者需保持一致,要么修改接口名,要么调整注入类型)

  2. 实现类构造函数名称错误:
    原实现类构造函数名为EmployeeDetailService,但类名是EmployeeService,必须保持一致才能正常依赖注入。

内容的提问来源于stack exchange,提问作者Bami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:14:54