如何使用 WCF 在 SOAP 请求中包含空的 xml 元素?



我必须使用Java的Web服务。服务方法的签名为

public bool UpsertEmployee(Employee employe);

问题是在生成SOAP时,对于具有 null 值的属性,请求中不包含相应的XML元素。结果是:

...
<Employee>
<id>1</id>
<firstName>Jhonny</firstName>
</Employee>

我想成为:

...
<Employee>
<id>1</id>
<firstName>Jhonny</firstName>
<lastName/>
</Employee>

有没有办法做到这一点?

我可以在调用 mehod 之前设置属性吗?

var client= new EmployeeServiceClient();;
// Can I do something here to accoplish my goal?    
client.UpsertEmployee(new Employee{
id = "1",
firstname = "Jhonny"
});

生成的Employee类代码为

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.36366")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "urn:mve.go.all.mdg.vendor")]
public partial class Employee : object, System.ComponentModel.INotifyPropertyChanged
{
private string idField;
private string firstNameField;
private string lastNameField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 0)]
public string id
{
get
{
return this.idField;
}
set
{
this.idField = value;
this.RaisePropertyChanged("id");
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 1)]
public string firstName
{
get
{
return this.firstNameField;
}
set
{
this.firstNameField = value;
this.RaisePropertyChanged("firstName");
}
}
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified, Order = 3)]
public string lastName
{
get
{
return this.lastNameField;
}
set
{
this.lastNameField = value;
this.RaisePropertyChanged("lastName");
}
}
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName)
{
System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
if ((propertyChanged != null))
{
propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
}

我无法修改文件代码,因为将来可能需要更新服务引用。

您的类标有XmlSerializer属性,因此您似乎正在使用该序列化程序。

您的问题是lastName属性null。 如Xsi:nil 属性绑定支持中所述:

将对象序列化为 XML 文档时:如果XmlSerializer类遇到与 XML 元素对应的对象的 null 引用,则它会生成指定xsi:nil="true"的元素,或者完全省略该元素,具体取决于是否应用nillable="true"设置。

因此,默认情况下,当lastName为 null 时,不会发出任何元素。 如果你要设置[XmlElementAttribute(IsNullable = true)]你会得到

<Employee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<id>1</id>
<firstName>Jhonny</firstName>
<lastName xsi:nil="true" />
</Employee>

这不是您想要的(在任何情况下您都无法更改自动生成的代码)。

相反,您需要将lastName初始化为空字符串:

var employee = new Employee
{
id = "1",
firstName = "Jhonny",
lastName = "",
};

然后将生成以下 XML:

<Employee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<id>1</id>
<firstName>Jhonny</firstName>
<lastName />
</Employee>

或者,由于自动生成的代码没有默认构造函数,因此您可以在单独的partial class代码文件中自行添加一个构造函数。 由于它独立于自动生成的代码文件,因此在重新生成生成的代码时不会覆盖:

public partial class Employee
{
public Employee()
{
this.firstName = this.lastName = this.id = "";
}
}

相关内容

  • 没有找到相关文章

最新更新