C#调用SOAP API出现CS7036错误,参数传递存疑
问题分析
CS7036错误直接指向参数不匹配:你调用PI_SClient.updatePaymentStatusAsync时传入了一个updatePaymentStatusRequest对象,但该方法实际要求传入5个独立参数(paymentStatusSearchCriteria、w3cReconciliationDate、action、additionalPaymentInformation、auditLogInfo),两者完全不匹配。
从你提供的代码来看:
- 你手动封装了
updatePaymentStatusRequest对象,但PI_SClient的updatePaymentStatusAsync并没有接受该对象的重载; - 你看到的那个“自动生成的多参数
updatePaymentStatusAsync”,是属于PaymentServiceStronglyTypedType类的方法,并非PI_SClient的方法。
解决方案
有两种直接的修复方式:
方式一:拆分request对象,传入独立参数
修改HRP_API方法,从传入的spType中提取各个属性,按要求传给Client的方法:
public static Task<XML_Rootobject.updatePaymentStatusResponse> HRP_API(XML_Rootobject.updatePaymentStatusRequest spType) { // ... 保留原有初始化代码 return PI_SClient.updatePaymentStatusAsync( spType.criteria, spType.w3cReconciliationDate, spType.action, spType.additionalPaymentInformation, spType.auditLogInfo ); }
注意:不要用
.GetAwaiter().GetResult()强行同步化异步操作——你的方法返回Task<>类型,上层调用又用了await,直接返回Task即可,同步阻塞会破坏异步流程,甚至引发死锁。
方式二:调用支持request对象的重载
如果你想直接传入封装好的request对象,可以将PI_SClient转换为PaymentServiceStronglyTypedType类型后调用对应方法:
public static Task<XML_Rootobject.updatePaymentStatusResponse> HRP_API(XML_Rootobject.updatePaymentStatusRequest spType) { // ... 保留原有初始化代码 return ((XML_Rootobject.PaymentServiceStronglyTypedType)PI_SClient).updatePaymentStatusAsync(spType); }
同样,不要用同步阻塞的方式获取结果,直接返回Task即可。
额外提示
- 检查自动生成的Client代码,确认
updatePaymentStatusAsync的所有重载,避免混淆不同类的同名方法; - SSIS环境下尽量保持异步流程的一致性,避免同步/异步混用引发异常。
内容的提问来源于stack exchange,提问作者mdolunt
相关产品推荐
相关产品推荐

