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

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服务都可以正常调用。

解决方案

  1. 检查是否为属性赋值了对应的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;
  1. 验证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; }
  1. 强制使用XmlSerializer序列化
    WCF默认可能使用DataContractSerializer,该序列化器对自定义XML属性的支持有限,在服务契约接口上添加[XmlSerializerFormat]特性,强制使用XmlSerializer进行序列化。

  2. 兜底方案:使用消息拦截器修改请求
    如果以上方案都不生效,可以实现IClientMessageInspector接口,在SOAP请求发送前手动插入缺失的XML属性,该方案可以100%匹配需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:27:01