2016-04-01 3 views
3

Недавно я переписал службу 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, которые нужно просто перевернуть.

Спасибо, Джеймс

+0

На стороне клиента класс, который содержит свойство 'freeShipping', также содержит свойство' freeShippingSpecified'. Если да, установите для этого свойства значение true и повторите попытку. –

+0

Это не так. Я унаследовал это, и никто, кто был вокруг, когда он был написан, больше не существует. Похоже, что у сервера есть спецификация для бесплатной доставки, но она не требуется и не всегда отправляется. Дизайн сервиса немного странный, а не то, как * I * сделал бы это, но мне не разрешено изменять формат сообщения, поэтому ... :( –

ответ

0

Итак, кто бы ни написал первоначальную версию службы, не назвал интерфейс, согласно которому они основывали свой контракт на использование «I» в качестве первого символа. Несмотря на то, что в конфигурации было указано определенное действие, это привело к неправильному совпадению формата сообщения.

2

Ваш тест использует SOAP 1,2 (http://www.w3.org/2003/05/soap-envelope) с WS-Addressing (записей заголовка a:Action, a:MessageID, ...), тогда как клиент использует SOAP 1,1 (http://schemas.xmlsoap.org/soap/envelope/).

Это обязательная проблема. Если вы хотите, чтобы клиент остался таким, как есть, измените привязку на своей стороне обслуживания.

1

Изменение связывания с WSHttpBinding (по умолчанию SOAP 1.2) использовать BasicHttpBinding (по умолчанию 1.1)

Или вы можете принудительно изменить версию мыла, используемую BasicHttpBinding использовать SOAP 1.2 по

`<textMessageEncoding messageVersion="Soap12" />` 

в customBindingConfig раздел.

+0

Извините, был на каникулах на прошлой неделе, просто увидел это теперь просто уточнить: app.config в моей служебной библиотеке использует basicHttpBinding, а web.config на моем веб-сайте вообще не имеет привязки. Таким образом, WCF по умолчанию для WSHttpBinding, и это моя проблема? Если я добавлю endpoint to web.config, который должен его исправить? Я спрашиваю, потому что мне нужно взаимодействие с клиентами, чтобы сделать это, и я не хочу слишком много прервать его, не имея всех подробностей. –

+0

Может быть, это поможет http: /stackoverflow.com/questions/6263813/what-is-the-default-wcf-binding – NatarajC

+0

Как упоминается в другом потоке, по умолчанию используется BsicHttpBinding с 1.1, поэтому вам нужно установить конфигурацию с обоих концов и убедиться, что привязки то же самое, иначе появится такая ошибка. – NatarajC

Смежные вопросы