У меня возникла проблема десериализации ответа Rest XML в свой объект. Если я сериализую контракт с данными, ожидаемый в потребительском приложении, форматирование XML немного отличается от того, что на самом деле получено из службы Rest. Класс контракта данных, который отправляется из службы, точно такой же, как тот, который я ожидаю. Если я изменю XML, полученный от службы Rest, на ответ, ожидаемый потребительским приложением, все будет работать.Deserializing XML From Rest service
Ответ, который я получаю от службы Rest, приведен ниже.
<GeneralInquiryResponseCollection xmlns=\"http://schemas.datacontract.org/2004/07/MEA.SmartApp.AdminGateway.ServiceContract.Responses\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">
<ResultCode i:nil=\"true\"/>
<ResultCodeDescription i:nil=\"true\"/>
<ResultInfoDescription i:nil=\"true\"/>
<ErrorMessage/>
<IsSuccess>true</IsSuccess>
<TransactionStatus>
<Description>Transaction Successful</Description>
<StatusCode>2000</StatusCode>
</TransactionStatus>
<AsOfDate>9999-12-31T00:00:00</AsOfDate>
<FunctionalGroupingCode>302</FunctionalGroupingCode>
<GeneralInquiryResponseContainer>
</GeneralInquiryResponseContainer>
<LastWMAValuationDate>0001-01-01T00:00:00</LastWMAValuationDate>
<PolicyNumber>551372461</PolicyNumber>
<TransactionExecutionDateTime>2014-01-14T15:05:05.859558</TransactionExecutionDateTime>
</GeneralInquiryResponseCollection>
XML, который я получаю после сериализации из ожидаемого контракта с данными, приведен ниже.
<?xml version=\"1.0\"?>
<GeneralInquiryResponseCollection xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
<ResultCode />
<ResultCodeDescription>Success</ResultCodeDescription>
<ResultInfoDescription>Result Info Description</ResultInfoDescription>
<IsSuccess>true</IsSuccess>
<TransactionStatus>
<Description>Transaction Successful</Description>
<StatusCode>2000</StatusCode>
<HTTPStatusCode>OK</HTTPStatusCode>
</TransactionStatus>
<StatusCode>2000</StatusCode>
<AsOfDate>9999-12-31T23:59:59.9999999</AsOfDate>
<FunctionalGroupingCode>302</FunctionalGroupingCode>
<LastWMAValuationDate>0001-01-01T00:00:00</LastWMAValuationDate>
<PolicyNumber>551372461</PolicyNumber>
<TransactionExecutionDateTime>2014-01-14T14:40:59.0930535-07:00</TransactionExecutionDateTime>
</GeneralInquiryResponseCollection>
Основные отличия между ними заключаются в следующем.
Потребитель ожидает, -
<?xml version=\"1.0\"?>
- но Rest служба не отправляет это.Потребитель ожидает, -
<GeneralInquiryResponseCollection xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
служба Rest посылает <GeneralInquiryResponseCollection xmlns=\"http://schemas.datacontract.org/2004/07/MEA.SmartApp.AdminGateway.ServiceContract.Responses\" xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\">
- Потребитель ожидает, что свойства нулевого значения не имеет тег в XML, но служба Rest отправляет тег я: ноль = \ "истинным \".
Код, десериализующийся, находится ниже, где T является генераторным запросомResponseCollection.
using (var ResponseStream = Response.GetResponseStream())
{
XmlSerializer Serializer = new XmlSerializer(typeof(T));
return (T)Serializer.Deserialize(ResponseStream);
}
Ниже сервисный контракт
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using MEA.SmartApp.AdminGateway.Interfaces;
namespace MEA.SmartApp.AdminGateway.ServiceContract.Responses
{
[DataContract]
public class GeneralInquiryResponseCollection : WMAResponse, IWMAResponse
{
#region Data Members
[DataMember]
public DateTime AsOfDate { get; set; }
[DataMember]
public string FunctionalGroupingCode { get; set; }
[DataMember]
public List<GeneralInquiryResponse> GeneralInquiryResponseContainer { get; set; }
[DataMember]
public DateTime LastWMAValuationDate { get; set; }
[DataMember]
public string PolicyNumber { get; set; }
[DataMember]
public DateTime? TransactionExecutionDateTime { get; set; }
#endregion
}
}
GeneralInquiryResponse
using System;
using System.Runtime.Serialization;
using System.Xml.Serialization;
using MEA.SmartApp.AdminGateway.Interfaces;
namespace MEA.SmartApp.AdminGateway.ServiceContract.Responses
{
[DataContract(Namespace = "")]
[XmlInclude(typeof(ClientResponse))]
[XmlInclude(typeof(ClientRoleResponse))]
[XmlInclude(typeof(DCAFundResponse))]
[XmlInclude(typeof(DCAResponse))]
[XmlInclude(typeof(GMABResponse))]
[XmlInclude(typeof(GMDBResponse))]
[XmlInclude(typeof(GMIBResponse))]
[XmlInclude(typeof(GWBResponse))]
[XmlInclude(typeof(InterestRateResponse))]
[XmlInclude(typeof(MoneyFundSegmentResponse))]
[XmlInclude(typeof(MRDFundResponse))]
[XmlInclude(typeof(PayoutFundResponse))]
[XmlInclude(typeof(PayoutResponse))]
[XmlInclude(typeof(PolicyFundResponse))]
[XmlInclude(typeof(PolicyResponse))]
[XmlInclude(typeof(PremiumBonusTransactionHistoryResponse))]
[XmlInclude(typeof(ProducerGroupSegmentResponse))]
[XmlInclude(typeof(RebalancingResponse))]
[XmlInclude(typeof(RebalancingScheduledFundResponse))]
[XmlInclude(typeof(RebalancingUnscheduledFundResponse))]
[XmlInclude(typeof(WithdrawalGrossTransactionHistoryResponse))]
[XmlInclude(typeof(WithdrawalSurrenderTransactionHistoryResponse))]
public abstract class GeneralInquiryResponse : IGeneralInquiryResponse
{
#region Data Members
[DataMember]
public string ResponseIdentifier { get; set; }
#endregion
}
}
Ive борется с этим на некоторое время, и Im удара тупиков. Какие-либо предложения?
Виджай, я пытаюсь выяснить, почему одна программа сериализации с , а другой нет. Как я могу управлять xmlns: xsi = \ "http: //www.w3.org/2001/XMLSchema-instance \", который сериализуется против xmlns = \ "http://schemas.datacontract.org/2004/07 /MEA.SmartApp.AdminGateway.ServiceContract.Responses \ "? –
GWines
@RichardSchneider поставил способ контролировать сериализацию в вашей модели. Если это не твоя модель, я боюсь, что ты мало что можешь сделать. – Faraday
@GWines - Не могли бы вы разместить свои файлы определения службы? – Faraday