将 XML 反序列化为 C# class 未按预期工作
Deserialization of XML into C# class not working as expected
我正在与 Realex XML API 合作,使用此处找到的 GitHub .Net 库向 MPI 服务器发送 3D 安全注册请求:
https://github.com/JonCanning/RealEx.NET
身份验证过程的前两个步骤对于 3D 安全测试卡 4012001037141112 运行良好,应该会导致 3D 安全身份验证成功,但在尝试反序列化 .Net [=24] 下面的 XML 时=] ThreeDSecure 永远不会被填充并且始终为空,尽管 XML 被相应地填充:
<response timestamp="20160830142152">
<merchantid>*****</merchantid>
<account>internet</account>
<orderid>92f669c7-6fb3-43e0-bfb9-8f62aca128cf</orderid>
<authcode />
<result>00</result>
<message>Authentication Successful</message>
<pasref />
<timetaken>0</timetaken>
<authtimetaken>0</authtimetaken>
<threedsecure>
<status>Y</status>
<eci>5</eci>
<cavv>AAACBDlZYkmAggkgJVliAAAAAAA=</cavv>
<xid>ZFD6gQMih8V5gzA3q/XODcrx8N8=</xid>
<algorithm>2</algorithm>
</threedsecure>
<sha1hash>a9800768d3e683de4cf074195884d67d29f79189</sha1hash>
</response>
.Net classes的代码如下:
namespace RealEx
{
[XmlRoot("response")]
public class RealExResponse
{
[XmlElement("result")]
public string Result { get; set; }
[XmlElement("message")]
public string Message { get; set; }
[XmlElement("pasref")]
public string PasRef { get; set; }
[XmlElement("authcode")]
public string AuthCode { get; set; }
[XmlElement("pareq")]
public string PaReq { get; set; }
[XmlElement("enrolled")]
public string Enrolled { get; set; }
[XmlElement("xid")]
public string Xid { get; set; }
[XmlElement("orderid")]
public string OrderId { get; set; }
[XmlElement("sha1hash")]
public string Sha1Hash { get; set; }
[XmlElement("merchantid")]
public string MerchantId { get; set; }
[XmlElement("account")]
public string Account { get; set; }
[XmlElement("timetaken")]
public string TimeTaken { get; set; }
[XmlElement("authtimetaken")]
public string AuthTimeTaken { get; set; }
[XmlElement("url")]
public string Url { get; set; }
[XmlAttribute("timestamp")]
public string TimeStamp { get; set; }
[XmlElement("threedsecure")]
public ThreeDSecure ThreeDSecure { get; set; }
[XmlElement("cvnresult")]
public string CvnResult { get; set; }
[XmlElement("avspostcoderesponse")]
public string AvsPostcodeResponse { get; set; }
[XmlElement("avsaddressresponse")]
public string AvsAddressResponse { get; set; }
[XmlElement("batchid")]
public string BatchId { get; set; }
[XmlElement("cardissuer")]
public CardIssuer CardIssuer { get; set; }
internal static RealExResponse Deserialize(string xml)
{
return new XmlSerializer(typeof(RealExResponse)).Deserialize(XDocument.Parse(xml).CreateReader()) as RealExResponse;
}
}
}
namespace RealEx
{
public class ThreeDSecure
{
public string Status { get; set; }
public string Eci { get; set; }
public string Cavv { get; set; }
public string Xid { get; set; }
public string Algorithm { get; set; }
}
}
namespace RealEx
{
public class RealEx3DAuthRequest : RealExAuthRequest
{
public RealEx3DAuthRequest(string secret, string merchantId, string account, string orderId, Amount amount, Card card, TssInfo tssInfo, ThreeDSecure threeDSecure, bool autoSettle, string custNum, string prodId, string varRef, Comments comments)
: base(secret, merchantId, account, orderId, amount, card, tssInfo, autoSettle, custNum, prodId, varRef, comments)
{
Mpi = new Mpi(threeDSecure.Cavv, threeDSecure.Xid, threeDSecure.Eci);
}
public Mpi Mpi { get; private set; }
}
}
我不明白为什么在响应中收到的信息没有写入 class 而所有其他属性都已正确写入 谁能帮助我理解这个问题吗?
您的 ThreeDSecure
属性与您 XML 中的名称不匹配。更改名称以匹配(即更改大小写)或添加适当的属性:
public class ThreeDSecure
{
[XmlElement("status")]
public string Status { get; set; }
[XmlElement("eci")]
public string Eci { get; set; }
[XmlElement("cavv")]
public string Cavv { get; set; }
[XmlElement("xid")]
public string Xid { get; set; }
[XmlElement("algorithm")]
public string Algorithm { get; set; }
}
顺便说一句,在反序列化之前无需将 XML 解析为 DOM。只需使用 StringReader
代替:
using (var reader = new StringReader(xml))
{
return (RealExResponse)new XmlSerializer(typeof(RealExResponse)).Deserialize(reader);
}
我正在与 Realex XML API 合作,使用此处找到的 GitHub .Net 库向 MPI 服务器发送 3D 安全注册请求: https://github.com/JonCanning/RealEx.NET
身份验证过程的前两个步骤对于 3D 安全测试卡 4012001037141112 运行良好,应该会导致 3D 安全身份验证成功,但在尝试反序列化 .Net [=24] 下面的 XML 时=] ThreeDSecure 永远不会被填充并且始终为空,尽管 XML 被相应地填充:
<response timestamp="20160830142152">
<merchantid>*****</merchantid>
<account>internet</account>
<orderid>92f669c7-6fb3-43e0-bfb9-8f62aca128cf</orderid>
<authcode />
<result>00</result>
<message>Authentication Successful</message>
<pasref />
<timetaken>0</timetaken>
<authtimetaken>0</authtimetaken>
<threedsecure>
<status>Y</status>
<eci>5</eci>
<cavv>AAACBDlZYkmAggkgJVliAAAAAAA=</cavv>
<xid>ZFD6gQMih8V5gzA3q/XODcrx8N8=</xid>
<algorithm>2</algorithm>
</threedsecure>
<sha1hash>a9800768d3e683de4cf074195884d67d29f79189</sha1hash>
</response>
.Net classes的代码如下:
namespace RealEx
{
[XmlRoot("response")]
public class RealExResponse
{
[XmlElement("result")]
public string Result { get; set; }
[XmlElement("message")]
public string Message { get; set; }
[XmlElement("pasref")]
public string PasRef { get; set; }
[XmlElement("authcode")]
public string AuthCode { get; set; }
[XmlElement("pareq")]
public string PaReq { get; set; }
[XmlElement("enrolled")]
public string Enrolled { get; set; }
[XmlElement("xid")]
public string Xid { get; set; }
[XmlElement("orderid")]
public string OrderId { get; set; }
[XmlElement("sha1hash")]
public string Sha1Hash { get; set; }
[XmlElement("merchantid")]
public string MerchantId { get; set; }
[XmlElement("account")]
public string Account { get; set; }
[XmlElement("timetaken")]
public string TimeTaken { get; set; }
[XmlElement("authtimetaken")]
public string AuthTimeTaken { get; set; }
[XmlElement("url")]
public string Url { get; set; }
[XmlAttribute("timestamp")]
public string TimeStamp { get; set; }
[XmlElement("threedsecure")]
public ThreeDSecure ThreeDSecure { get; set; }
[XmlElement("cvnresult")]
public string CvnResult { get; set; }
[XmlElement("avspostcoderesponse")]
public string AvsPostcodeResponse { get; set; }
[XmlElement("avsaddressresponse")]
public string AvsAddressResponse { get; set; }
[XmlElement("batchid")]
public string BatchId { get; set; }
[XmlElement("cardissuer")]
public CardIssuer CardIssuer { get; set; }
internal static RealExResponse Deserialize(string xml)
{
return new XmlSerializer(typeof(RealExResponse)).Deserialize(XDocument.Parse(xml).CreateReader()) as RealExResponse;
}
}
}
namespace RealEx
{
public class ThreeDSecure
{
public string Status { get; set; }
public string Eci { get; set; }
public string Cavv { get; set; }
public string Xid { get; set; }
public string Algorithm { get; set; }
}
}
namespace RealEx
{
public class RealEx3DAuthRequest : RealExAuthRequest
{
public RealEx3DAuthRequest(string secret, string merchantId, string account, string orderId, Amount amount, Card card, TssInfo tssInfo, ThreeDSecure threeDSecure, bool autoSettle, string custNum, string prodId, string varRef, Comments comments)
: base(secret, merchantId, account, orderId, amount, card, tssInfo, autoSettle, custNum, prodId, varRef, comments)
{
Mpi = new Mpi(threeDSecure.Cavv, threeDSecure.Xid, threeDSecure.Eci);
}
public Mpi Mpi { get; private set; }
}
}
我不明白为什么在响应中收到的信息没有写入 class 而所有其他属性都已正确写入 谁能帮助我理解这个问题吗?
您的 ThreeDSecure
属性与您 XML 中的名称不匹配。更改名称以匹配(即更改大小写)或添加适当的属性:
public class ThreeDSecure
{
[XmlElement("status")]
public string Status { get; set; }
[XmlElement("eci")]
public string Eci { get; set; }
[XmlElement("cavv")]
public string Cavv { get; set; }
[XmlElement("xid")]
public string Xid { get; set; }
[XmlElement("algorithm")]
public string Algorithm { get; set; }
}
顺便说一句,在反序列化之前无需将 XML 解析为 DOM。只需使用 StringReader
代替:
using (var reader = new StringReader(xml))
{
return (RealExResponse)new XmlSerializer(typeof(RealExResponse)).Deserialize(reader);
}