Как работать с xs: any в WCF Data Contract - PullRequest
1 голос
/ 05 июля 2010

ломает голову над WCF ... У меня есть XML-сообщения, в которых потомками <DataFields> может быть что угодно, например ...

<Test1Root> 
  <CaseNo></CaseNo>
  <Activity></Activity>
  <DataFields>
     <AccountRef></AccountRef>
     <PropRef></PropRef>
     <User></User>
  </DataFields>
</Test1Root>

Я обработал это в BizTalk с помощью<xs:any> для <DataFields> ...

<xs:element name="DataFields">
  <xs:complexType>
    <xs:sequence>
      <xs:any minOccurs="0" maxOccurs="unbounded" processContents="skip" />
    </xs:sequence>
  </xs:complexType>
</xs:element>

Но я изо всех сил пытаюсь понять, как справиться с этим в WCF [DataContract] ...

Я пытался использовать оба svcutil.exe и xsd.exe для создания классов, и оба они дают основные элементы (CaseNo, Activity и т. Д.), Но ни один из них не обрабатывает xs: любой из DataFields...

  • svcutil имеет поля данных как XmlElement
  • xsd имеет его как класс, но со свойством Any типа XmlElement []

Можно ли улучшить обработку дочерних элементов?

Ответы [ 3 ]

2 голосов
/ 05 июля 2010

Ну, xs:any может быть чем угодно, поэтому лучшее, что могут сделать инструменты .NET, это дать вам массив объектов ....

Поскольку это может быть что угодно, с этим мало что можно поделать, верно? Это может быть что угодно ... поэтому вам нужно использовать тип, который может быть любым.

Если вам действительно нужно это xs:any в вашей XML-схеме, и вы не можете заменить, например, на. набор более конкретных xs:element (возможно, наследующих друг от друга), я не понимаю, как вы могли бы получить лучшую поддержку ...

0 голосов
/ 26 октября 2012

У меня были некоторые проблемы со старым веб-сервисом, в котором WSDL определял свойство response с помощью элемента any.

Решена проблема с пользовательским форматером сообщений.Написал пост об этом, описывающий решение более подробно http://devdump.wordpress.com/2012/10/26/working-with-legacy-web-services-and-wcf/, надеюсь, что это сэкономит время другим, так как это была единственная дискуссия, которую я смог найти по этому вопросу.

0 голосов
/ 08 июня 2011

Вы можете сделать это. Я делал это много раз в службе. Я мало что делал в WCF, но считаю, что они работают одинаково. <xs:any> в схеме преобразуется в код XmlElement. В вашем случае массив XmlElement.

...