WCF XML Post 仅请求部分加载对象
WCF XML Post Request Only Partially Loading Object
我有一个带有 "POST" 方法的 WCF 服务,该方法接收 XML 并将其转换为一个对象,问题是只加载了一些字段。
对象样本:
[DataMember, XmlElement(IsNullable = false, Type = typeof(String))]
public String ClaimKey
{
get;
set;
}
[DataMember, XmlElement(IsNullable = false, Type = typeof(String))]
public String VehicleRegistrationNo
{
get;
set;
}
输入样本
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
public SalvageInstructionResponse Test(SalvageInstructionRequestHeader Item)
{
this._objOutput = new SalvageInstructionResponse(SalvageInstructionResponseStatus.FAILURE, "Test", Item.ToString());
return this._objOutput;
}
XML 样本:
<ClaimKey>str1234</ClaimKey>
<VehicleRegistrationNo>str1234</VehicleRegistrationNo>
因此仅使用上述示例 "VehicleRegistrationNo" 正在加载,但 ClaimKey 为空。
XML 和 class 更大,但它加载了大约 40% 的属性。
在服务端和客户端之间传递对象时,需要保证DataContract是一致的。
IExtensibleDataObject 接口是保持一致性的好选择。 DataMember 和 IsRequired 属性 都对这个问题有影响。
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-contract-versioning
此外,Data contract Serializer 受 MaxItemInObjectGraph 属性 的约束。参考以下代码。
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpsGetEnabled="true" httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
</behavior>
</serviceBehaviors>
如果有什么我可以帮忙的,请随时与我联系。
对于遇到此问题的任何其他人来说,这是因为 XML 中的节点未按字母顺序排列并且未设置 DataMember(OrderNo)。因此,当它序列化对象时,.NET 只是在做 "The best it could".
我有一个带有 "POST" 方法的 WCF 服务,该方法接收 XML 并将其转换为一个对象,问题是只加载了一些字段。
对象样本:
[DataMember, XmlElement(IsNullable = false, Type = typeof(String))]
public String ClaimKey
{
get;
set;
}
[DataMember, XmlElement(IsNullable = false, Type = typeof(String))]
public String VehicleRegistrationNo
{
get;
set;
}
输入样本
[WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
public SalvageInstructionResponse Test(SalvageInstructionRequestHeader Item)
{
this._objOutput = new SalvageInstructionResponse(SalvageInstructionResponseStatus.FAILURE, "Test", Item.ToString());
return this._objOutput;
}
XML 样本:
<ClaimKey>str1234</ClaimKey>
<VehicleRegistrationNo>str1234</VehicleRegistrationNo>
因此仅使用上述示例 "VehicleRegistrationNo" 正在加载,但 ClaimKey 为空。
XML 和 class 更大,但它加载了大约 40% 的属性。
在服务端和客户端之间传递对象时,需要保证DataContract是一致的。
IExtensibleDataObject 接口是保持一致性的好选择。 DataMember 和 IsRequired 属性 都对这个问题有影响。
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-contract-versioning
此外,Data contract Serializer 受 MaxItemInObjectGraph 属性 的约束。参考以下代码。
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpsGetEnabled="true" httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
</behavior>
</serviceBehaviors>
如果有什么我可以帮忙的,请随时与我联系。
对于遇到此问题的任何其他人来说,这是因为 XML 中的节点未按字母顺序排列并且未设置 DataMember(OrderNo)。因此,当它序列化对象时,.NET 只是在做 "The best it could".