Настройка тега xmlns: a = в мыльном ответе от WCF - PullRequest
1 голос
/ 22 ноября 2011

Я создаю сервис для ответа на звонки. Однако клиент (не написанный мной) не может прочитать ответ. Мы обнаружили, что это происходит из-за несовпадения пространства имен в

xmlns:a="http://schemas.datacontract.org/2004/07/MyProject.Classes"

Есть ли способ переопределить это пространство имен? Я уверен, что это так.

Тег [ServiceBehavior] имеет "http://correctnamespace.com" NameSpace

BindingNameSpace в app.config имеет "http://correctnamespace.com" Пространство имен

[ServiceContract] имеет "http://correctnamespace.com" Пространство имен

Я посмотрел на OperationsContract, чтобы посмотреть, смогу ли я найти его, но без везения.

пространство имен должно быть "http://correctnamespace.com"

Ниже приведен полный пример верхней части ответа SOAP

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<getAddressResponse xmlns="http://correctnamespace.com">
<getAddressReturn xmlns:a="http://schemas.datacontract.org/2004/07/MyProject.Classes" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:PropertyChanged i:nil="true" xmlns:b="http://schemas.datacontract.org/2004/07/System.ComponentModel"/>
<a:addressField>Happystreet 21</a:addressField>

Я надеюсь, что кто-то может помочь мне разобраться с этим как можно скорее.

Добавлена ​​информация

Сервис создан для клиента.

Клиент предварительно спроектирован, а служба создана на основе файла WSDL, предоставленного создателем клиента.

Также обратите внимание, что клиент не может быть изменен. (

Ответы [ 3 ]

0 голосов
/ 22 ноября 2011

Основываясь на добавленной информации, у меня снова есть два предложения.

Во-первых, вам нужно будет зайти и вручную изменить пространство имен мыльного ответа AddressReturn и следовать по цепочке, чтобы любые ссылки на вышеупомянутоеОтвет имеет правильное пространство имен.Это будет утомительно и раздражающе, но вы можете запрограммировать парсер xml, который может найти любые ссылки на такое поле и внести необходимые изменения как в схему, так и в WSDL.

Во-вторых, использовать предоставленный вам WSDL.клиентом, чтобы создать свой собственный WSDL, который будет работать с клиентом, но имеет соглашения об именах, которые вы хотите включить.Первое кодирование WSDL может быть сделано таким образом, и иногда рекомендуется, потому что оно обеспечивает скелет, который вы используете при создании и изменении, чтобы сделать его своим собственным и соответствовать вашим потребностям.

0 голосов
/ 23 ноября 2011

Решено путем копирования всех классифицированных из WSDL и создания вместо них DataContracts, в этом можно определить пространство имен, как для ServiceContract.

[DataContract(Namespace = "http://correctnamespace.com")]
public class Amount
{

Спасибо за evryone, который нашел время, чтобы помочь мнерешить его.

0 голосов
/ 22 ноября 2011

У меня есть пара предложений.

Во-первых, если предположить, что песочные заглушки кода на стороне сервера все правильные и работают правильно, попросите клиента восстановить заглушки на стороне клиента.Возможно, что используемая заглушка как-то устарела или была изменена.

Во-вторых, если серверная часть также не работает должным образом, я рекомендую воссоздать ваш WSDL с нуля.Правильное кодирование SOAP - это WSDL для создания кода.Таким образом, если ваш WSDL был сгенерирован инструментом, у него будет определенное соглашение об именах, и, хотя вы можете вручную изменить такие вещи, как ваши xmlns, если вы пропустите один из них (что, как кажется, произошло), это испортит ваш код.Поэтому вернитесь и создайте WSDL с нуля и сгенерируйте классы кода из WSDL, чтобы вы могли называть все так, как вы хотите, чтобы оно было названо.

...