C# .NET Core调用Workday Java Webservice如何在SOAP请求中添加XML属性
问题描述
我正在尝试使用.NET Core C#调用Java编写的Workday Web服务,目前遇到的问题是SOAP请求中无法生成指定的XML属性。
期望生成的请求片段:
... <wd:Usage_Data wd:Public="true"> <wd:Type_Data wd:Primary="true"> <wd:Type_Reference> ...
实际生成的请求片段:
... <wd:Usage_Data> <wd:Type_Data> <wd:Type_Reference> ...
我已经在C#代码中做了对应设置,但wd:Public="true"这类属性始终无法出现在最终发送的XML请求中。
已尝试的操作:
- 为Workday创建了WCF服务引用
- 修改了Reference.cs文件
- 调整了XML序列化器配置
以上操作均未解决问题,其他不需要传递属性的Workday服务都可以正常调用。
解决方案
- 检查是否为属性赋值了对应的
Specified字段
WCF自动生成的服务引用类中,所有值类型的属性都会同步生成一个[属性名]Specified的布尔类型字段,仅给属性本身赋值不会触发序列化输出,必须同时将对应Specified字段设为true。
示例代码:
// 仅赋值属性不会生效 usageData.Public = true; typeData.Primary = true; // 必须同时设置Specified字段为true usageData.Public = true; usageData.PublicSpecified = true; typeData.Primary = true; typeData.PrimarySpecified = true;
- 验证Reference.cs中属性的命名空间配置
打开自动生成的Reference.cs文件,检查Public、Primary属性上的XmlAttributeAttribute是否配置了正确的Workday命名空间,确保和SOAP信封中wd前缀对应的命名空间完全一致。
正确配置示例:
// Namespace值替换为你实际使用的Workday服务命名空间地址 [System.Xml.Serialization.XmlAttributeAttribute(Namespace = "urn:com.workday/bsvc")] public bool Public { get; set; } [System.Xml.Serialization.XmlIgnoreAttribute()] public bool PublicSpecified { get; set; }
强制使用XmlSerializer序列化
WCF默认可能使用DataContractSerializer,该序列化器对自定义XML属性的支持有限,在服务契约接口上添加[XmlSerializerFormat]特性,强制使用XmlSerializer进行序列化。兜底方案:使用消息拦截器修改请求
如果以上方案都不生效,可以实现IClientMessageInspector接口,在SOAP请求发送前手动插入缺失的XML属性,该方案可以100%匹配需求。
内容的提问来源于stack exchange,提问作者101chris
相关产品推荐
相关产品推荐

