避免在运行时序列化 SOAP 属性



我们使用具有SaveCustomer函数的SOAP服务。SaveCustomer 函数采用下面列出的 Customer 对象,并在字段中指定了值,则更新更改。

今天我们发现,如果我们只想更新 genderField,我们不应该发送任何其他字段,甚至不能作为 null。基本上我们必须避免序列化。 问题是,如果我们发送类似以下内容的内容:

<Customer>
<customerIdField>1</customerIdField>
</emailField>
<genderField>5</genderField>
</Customer>

然后系统将删除电子邮件字段。我们如何在运行时轻松指定对象上的字段是否应包含在序列化中?我看过类似 SOAP 忽略的东西,但它看起来非常脆弱且使用起来有风险。例如,如果将新字段添加到对象中怎么办?

同时,我们实际上必须能够将字段指定为 null,以防我们实际需要从我们使用的系统中的客户中删除它。

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.8.3752.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.namespace.come/")]
public partial class Customer : CompanyEntity {
private string customerIdField;
private string firstNameField;
private string lastNameField;
private Address[] addressField;
private PhoneNumber[] phoneNumberListField;
private string emailField;
private EmailBounce emailBounceField;
private Gender genderField;
private string sSNField;
private bool controlStatusField;
private CustomerProperties propertiesField;
private CreditCheck creditCheckField;
private ClubProperties clubPropertiesField;
private CustomerConsent[] customerConsentField;
private SalesChannelInfo[] salesChannelInfoListField;

查看您的项目与我的项目之间的差异,您缺少数据协定类中的"指定"字段。

给定 wsdl :

<xs:complexType name="setAuthorization">
<xs:sequence>
<xs:element form="qualified" minOccurs="0" name="action" type="tns:actionType"/>
<xs:element form="qualified" minOccurs="0" name="role" type="tns:roleType" />
</xs:sequence>
</xs:complexType>

您应该生成诸如 ;

[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.7.3081.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:si-dmp-habilitations")]
public partial class setAuthorization
{
private actionType actionField;
private bool actionFieldSpecified;
private roleType roleField;
private bool roleFieldSpecified;

它是"指定"字段,允许您区分空删除任何存在和空我不变此值。

检查您的 WSDL 是否包含 minHappen="0"。 看看你生成代理的方式。 在我的示例中,我使用以下语法使用 SvcUtil:

svcutil  /t:code /l:c# /o:"C:TempGeneratedServiceReferencesHabilitationsService.cs" /config:"C:TempGeneratedServiceReferencesHabilitationsService.config" /namespace:*,TLSiKitEditeur.HabilitationService /serializer:Auto /wrapped      wsdlHabilitations.wsdl

我希望这有所帮助

相关内容

  • 没有找到相关文章

最新更新