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

ASP.NET Core使用SoapCore开发SOAP接口时请求参数为空怎么解决?

问题根源分析

当前代码和官方请求格式存在4处核心不匹配,导致SOAP反序列化失败参数为null:

  1. 服务契约命名空间不匹配:代码中ServiceContract的命名空间是http://txn.xxx.com,但官方请求中txn前缀对应的命名空间是http://txnHost.payter.com
  2. 方法名大小写不匹配:官方请求中调用的方法节点是<txn:reserve(小写r开头),定义的方法名是大写R开头的Reserve
  3. 参数列表和顺序完全不匹配:
    • 官方请求参数包含currency字段,现有方法未定义该参数
    • 参数顺序和官方请求不一致:官方顺序中token在txnId之前,现有方法中txnId在token之前
  4. 方法参数默认继承服务契约命名空间,而官方请求中的参数都没有命名空间
修复代码步骤

1. 修正服务契约定义

调整命名空间、方法名、参数列表、参数顺序,同时给每个参数指定空命名空间:

// 修正命名空间为官方请求的txn命名空间
[ServiceContract(Namespace = "http://txnHost.payter.com")]
public interface ISampleService
{
    // 显式指定操作名是小写的reserve,匹配请求节点
    [OperationContract(Name = "reserve")]
    // 严格按照官方请求的参数顺序排列,新增currency参数,每个参数指定Namespace为空
    void Reserve(
        [MessageParameter(Namespace = "")] long timestamp,
        [MessageParameter(Namespace = "")] string posId,
        [MessageParameter(Namespace = "")] string employeeRef,
        [MessageParameter(Namespace = "")] string merchantRef,
        [MessageParameter(Namespace = "")] int amountCents,
        [MessageParameter(Namespace = "")] string currency,
        [MessageParameter(Namespace = "")] string itemRef,
        [MessageParameter(Namespace = "")] int validitySeconds,
        [MessageParameter(Namespace = "")] PayterTokenRequest token,
        [MessageParameter(Namespace = "")] long txnId,
        [MessageParameter(Namespace = "")] string signature);
}

public class SampleService : ISampleService
{
    // 实现方法的参数顺序和接口保持完全一致
    public void Reserve(long timestamp, string posId, string employeeRef, string merchantRef, int amountCents, string currency, string itemRef, int validitySeconds, PayterTokenRequest token, long txnId, string signature)
    {
        // 业务逻辑实现
        return;
    }
}

2. 简化PayterTokenRequest类定义

移除重复特性,保留DataContract和DataMember即可:

[DataContract(Name = "token", Namespace = "")]
public class PayterTokenRequest
{
    [DataMember(Name = "tokenId", Order = 0)]
    public string TokenId { get; set; }

    [DataMember(Name = "tokenRef", Order = 1)]
    public string TokenRef { get; set; }

    [DataMember(Name = "tokenVersion", Order = 2)]
    public int TokenVersion { get; set; }
}

3. 检查SoapCore注册配置

确保Program.cs/Startup.cs中注册SoapCore时,使用XmlSerializer适配老版本SOAP编码格式:

builder.Services.AddSoapCore();
// 省略其他服务注册逻辑

var app = builder.Build();
// 省略其他中间件配置
app.UseSoapEndpoint<ISampleService>("/SampleService.svc", new SoapEncoderOptions(), SoapSerializer.XmlSerializer, caseInsensitivePath: true);

修改完成后重新启动服务即可正常接收官方格式的请求参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:45:01