Недавно я переписал службу WCF для клиента. Их предыдущая служба была на .NET 3.5, и я очистил код и обновился до 4.5.2.WCF Форматирование сообщений
Функционально сервис работает, но у меня возникают проблемы с некоторыми аспектами формата сообщений, которые не совпадают.
Когда я использую клиент WCF службы для тестирования службы, я получаю сообщение со следующей структурой:
<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">
<s:Header>
<a:Action s:mustUnderstand="1">http://XXXXX.com/XXXXX/service/v1_0/IXXXXXInterfacePort/GetRates</a:Action>
<a:MessageID>urn:uuid:071db031-f492-42f5-89e6-fb4a321c81c9</a:MessageID>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<GetRatesIP xmlns="http://XXXXX.com/XXXXX/service/v1_0">
<ShipmentHeader xmlns="">
<ShipmentID>XXXXX</ShipmentID>
<Zipcode>XXXXX</Zipcode>
</ShipmentHeader>
<ShipmentItemsList xmlns="">
<ShipmentItems>
<quantity>10</quantity>
<sku>XXXXX</sku>
<freeShipping>true</freeShipping>
</ShipmentItems>
</ShipmentItemsList>
</GetRatesIP>
</s:Body>
Но когда клиент ставит службу в тесте сообщение структура приходит от клиента выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
\t <soap:Body>
\t \t <GetRatesIP xmlns="http://XXXXX.com/XXXXX/service/v1_0">
\t \t \t <ShipmentHeader xmlns="">
\t \t \t \t <ShipmentID>XXXXX</ShipmentID>
\t \t \t \t <Zipcode>XXXXX</Zipcode>
\t \t \t </ShipmentHeader>
\t \t \t <ShipmentItemsList xmlns="">
\t \t \t \t <ShipmentItems>
\t \t \t \t \t <quantity>10</quantity>
\t \t \t \t \t <sku>XXXXX</sku>
\t \t \t \t </ShipmentItems>
\t \t \t </ShipmentItemsList>
\t \t </GetRatesIP>
\t </soap:Body>
</soap:Envelope>
Данные мудры, все кажется ОК. Моя версия имеет атрибут бесплатной доставки, но из того, что я вижу, это рассматривается как необязательное для службы и должно быть ОК, если оно отсутствует. Во всяком случае, клиент утверждает, что даже несмотря на то, что он находится в коде, значение никогда не было отправлено клиентом службы, хотя это упоминается в их коде.
Мое предположение заключается в том, что у службы возникают проблемы с стилем «soap: Envelope ...» или «s: Envelope ...». Я использовал те же сервисные контракты. В существующем коде использовался XML-сериализатор в отличие от сериализатора данных, но я снова скопировал атрибуты (Serializable, XmlType, XmlArray, XmlArrayItem и т. Д.) И атрибуты MessageContract именно из существующего кода. Посмотрел на конфигурацию на сервере, там ничего не было. Работа над получением конфигурации на стороне клиента, но не ожидающая его пролить свет.
У кого-нибудь есть идеи, что здесь может быть? Я был (и буду продолжать) смотреть в Интернете, но я не нахожу ответа. Моя удача, это какой-то странный, неясный флаг, установленный где-то в чашах Visual Studio/WCF, которые нужно просто перевернуть.
Спасибо, Джеймс
На стороне клиента класс, который содержит свойство 'freeShipping', также содержит свойство' freeShippingSpecified'. Если да, установите для этого свойства значение true и повторите попытку. –
Это не так. Я унаследовал это, и никто, кто был вокруг, когда он был написан, больше не существует. Похоже, что у сервера есть спецификация для бесплатной доставки, но она не требуется и не всегда отправляется. Дизайн сервиса немного странный, а не то, как * I * сделал бы это, но мне не разрешено изменять формат сообщения, поэтому ... :( –