Десериализация XML в класс C# не работает должным образом

Я работаю с Realex XML API для отправки запросов безопасной регистрации 3D на сервер MPI с помощью библиотеки GitHub .Net, которая находится здесь: https://github.com/JonCanning/RealEx.NET

Первые два шага процесса аутентификации работают хорошо для тестовой карты 3D-безопасности 4012001037141112, которая должна привести к успешной аутентификации 3D-безопасности, но при попытке десериализации XML ниже класса.Net 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 выглядит следующим образом:

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; }
    }
}

Я не могу понять, почему информация, полученная в ответе, не записывается в класс, когда все остальные свойства пишутся правильно, может кто-нибудь помочь мне понять эту проблему?

1 ответ

Решение

Ваш 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);
}          
Другие вопросы по тегам