WCF: Должны ли все поставщики данных использовать одно и то же пространство имен? - PullRequest
1 голос
/ 30 декабря 2010

У меня есть несколько сервисных контрактов, представленных поверх WCF, в которых используется несколько контрактов на передачу данных.Услуга предназначена для использования Adobe Flex.Я столкнулся со многими проблемами, заставляя Flex использовать WSDL, созданный сервером.Я использовал процедуру, описанную здесь , чтобы сжать WSDL в один файл (я использовал FlatWsdl, а не WcfExtras, если это важно).

Теперь я получаю кучу ошибок при использованииСобственный инструмент VS2010 wsdl.exe для извлечения моих метаданных.В частности, я получаю следующие ошибки:

1) Schema validation warning: Schema item 'complexType' named 
   'ArrayOfKeyValueOfSomeKeySomeValuep1alXzIb' from namespace 
   'http://schemas.microsoft.com/2003/10/Serialization/Arrays' is invalid. 
   Namespace 'http://My/Wcf/Namespace' is not available to be referenced
   in this schema.

2) Schema validation warning: Schema item 'complexType' named 'MyComplexType'
   from namespace 'http://My/Wcf/Namespace' is invalid. Namespace 
   'http://schemas.datacontract.org/2004/07/My.Real.Namespace' is not available
   to be referenced in this schema.

Теперь тип словаря ("ArrayOfKeyValueOf ..."), очевидно, определен во внешней схеме, которая не импортируется моим WSDL.Обратите внимание, что SomeKey и SomeValue имеют пространство имен datacontract My / Wcf / Namespace.

Что касается MyComplexType, то странно то, что если я изменю его пространство имен Datacontract на то же пространство имен, которое используется моими службами, серверамии привязки, то ошибка (2) исчезает.Я не могу понять, почему.

То, что я спрашиваю, сводится к двум вопросам:

1) Как я могу добавить директиву импорта внешней схемы в мой WSDL?Я видел некоторые решения онлайн, которые предлагали написать класс-оболочку вокруг контейнеров.Это то, чего я действительно хотел бы избежать.

2) Мне действительно нужно поместить все мои контракты данных в одно пространство имен?У меня нет никаких технических возражений против этого, но будет очень сложно изменить пространство имен всех контрактов данных.Возможно, есть автоматизированный способ достижения этого?

TIA!

1 Ответ

0 голосов
/ 05 февраля 2011

Так что на тот случай, если кто-то столкнется с той же проблемой при доступе к серверу WCF (BasicHttpBinding) из клиента Flex:

1) Нет, все DataContracts не обязательно должны находиться в одном пространстве имен (но все ServiceContracts, реализации служб и привязки do должны находиться в одном пространстве имен!).

2) Суть проблемы в том, что Flex ожидает, что каждая схема xsd: будет иметь «пространство имен xsd: import» для всех пространств имен, на которые она ссылается.Этот импорт должен иметь вид:

<xsd:import namespace="http://schemas.datacontract.org/2004/07/SomeNamespace" />

Похоже, нет способа сделать это с WCF, поскольку он автоматически добавляет автоматически сгенерированный атрибут schemaLocation к этому тегу, что заставляет Flex попробоватьчтобы получить эту схему расположения.Единственный обходной путь, по-видимому, заключается в ручном манипулировании WSDL на уровне XML (например, путем предоставления конечной точки REST для извлечения метаданных).

Спасибо Ярону Наве на форумах MSDN WCF за его помощь.Обсуждение может быть найдено в http://social.msdn.microsoft.com/Forums/en/wcf/thread/b9429e30-e4d5-454f-9fbd-bae39990ff33.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...