Десериализовать Boolean из Soap с помощью Servicestack - PullRequest
0 голосов
/ 28 апреля 2018

Я отправляю запрос на мыло из SSRS в servicetack, и независимо от того, что я пытаюсь, я не могу заставить Servicestack распознать что-либо как логическое значение и десериализовать его.

[DataContract]
[Route("/Stuff")]
public class GetStuff : IReturn<GetStuffResponse>
{
    [DataMember]
    [ApiMember(Name = "Is Enabled",
        DataType = "bool",
        IsRequired = false)]
    public bool? IsEnabled { get; set; }
}

Входящий запрос на мыло выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetStuff xmlns="http://www.myCompany.com/types">
      <IsEnabled>true</IsEnabled>
    </GetTradesGroupedByClient>
  </soap:Body>
</soap:Envelope>

Я пытался заставить запрос мыла отправлять «0» и «1» для true / false и true с заглавной буквой «T», но Servicestack всегда десериализует его как «null».

У кого-нибудь есть предложения?

Редактировать 1

Обновление о дальнейшей странности. Я заменил bool на int в надежде, что это будет меньше хлопот, но это также не десериализовать. Поэтому я добавил несколько полей в запрос, чтобы проверить, не произойдет ли вся десериализация:

[DataContract]
[Route("/Stuff")]
public class GetStuff : IReturn<GetStuffResponse>
{
    [DataMember]
    [ApiMember(Name = "Summary Date",
        DataType = "DateTime",
        IsRequired = false)]
    public DateTime? SummaryDate { get; set; }

    [DataMember]
    [ApiMember(Name = "Summary End Date",
        DataType = "DateTime",
        IsRequired = false)]
    public DateTime? SummaryEndDate { get; set; }

    [DataMember]
    [ApiMember(Name = "Symbol",
        DataType = "string",
        IsRequired = false)]
    public string Symbol { get; set; }

    [DataMember]
    [ApiMember(Name = "Email",
        DataType = "string",
        IsRequired = false)]
    public string Email { get; set; }

    [DataMember]
    [ApiMember(Name = "Is Enabled",
        DataType = "int",
        IsRequired = false)]
    public int? IsEnabled { get; set; }
}

Вот мыло, отправляемое в serviceStack:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <GetStuff xmlns="http://www.myCompany.com/types">
      <SummaryDate>2018-04-26</SummaryDate>
      <SummaryEndDate>2018-04-26</SummaryEndDate>
      <Symbol>TOU</Symbol>
      <Email>Guy.Smiley@myCompany.net</Email>
      <IsEnabled>1</IsEnabled>
    </GetStuff>
  </soap:Body>
</soap:Envelope>

Теперь вот где это странно, две даты и поле «символ» десериализованы правильно. Поле 'Email' и поля 'IsEnabled' не заполнены и имеют нулевое значение. Есть ли способ отследить десериализатор в Serivcestack?

1 Ответ

0 голосов
/ 28 апреля 2018

ServiceStack не использует свой собственный XML Serializer, он использует класс .NET WCF Message и .NET Xml DataContract Serializer для сериализации / десериализации запросов SOAP.

SOAP WCF является очень строгим / хрупким, поэтому вам нужно точно отслеживать, что было отправлено, чтобы знать, какой именно SOAP / XML нужно отправлять. Самый простой способ сделать это - использовать Soap12ServiceClient для отправки запроса DTO и анализатор пакетов, например Fiddler , для захвата отправленного необработанного тела HTTP-запроса, например:

var client = new Soap12ServiceClient(baseUrl);

var request = new GetStuff {
    SummaryDate = DateTime.Parse("2018-04-26"),
    SummaryEndDate = DateTime.Parse("2018-04-26"),
    Symbol = "TOU",
    Email = "Guy.Smiley@myCompany.net",
    IsEnabled = true,
};

var response = client.Send(request);

, который отправляет запрос SOAP:

<?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
   <s:Header>
      <a:Action s:mustUnderstand="1">GetStuff</a:Action>
      <a:MessageID>urn:uuid:5cb1b87c-82ae-422b-9b6a-3044eeb90fe7</a:MessageID>
      <a:ReplyTo>
         <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
      </a:ReplyTo>
      <a:To s:mustUnderstand="1">http://test.servicestack.net/Soap12</a:To>
   </s:Header>
   <s:Body>
      <GetStuff xmlns="http://schemas.servicestack.net/types" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
         <Email>Guy.Smiley@myCompany.net</Email>
         <IsEnabled>true</IsEnabled>
         <SummaryDate>2018-04-26T00:00:00</SummaryDate>
         <SummaryEndDate>2018-04-26T00:00:00</SummaryEndDate>
         <Symbol>TOU</Symbol>
      </GetStuff>
   </s:Body>
</s:Envelope>

Обратите внимание, что порядок свойств в алфавитном порядке, что важно в SOAP / XML.

...