xsd.exe - от схемы к классу - для использования с WCF

Я создал схему как согласованный интерфейс между нашей компанией и внешней компанией. Сейчас я создаю веб-службу WCF C # для обработки интерфейса.

Я запустил утилиту XSD, и она создала класс C #. Схема была создана в BizTalk и ссылается на другие схемы, поэтому в целом создается более 15 классов.

Я помещаю атрибут [DataContract} перед каждым из классов. Должен ли я помещать атрибут [DataMember] для каждого отдельного свойства?
Когда я генерирую тестовую клиентскую программу, прокси-сервер не имеет кода для любого из этих 15 классов.

Мы использовали этот метод при использовании служб .asmx, но не уверены, будет ли он работать так же с WCF. Если мы изменим схему, мы захотим регенерировать класс WCF, а затем нам придется каждый раз обновлять его со всеми атрибутами [DataMember]? Есть ли более новый инструмент, похожий на XSD.exe, который будет лучше работать с WCF?

Спасибо,

Нил Уолтерс

РЕШЕНИЕ (закопано в одном из ответов / комментариев Сондерса):

Добавьте XmlSerializerFormat в определение интерфейса:

    [OperationContract]
    [XmlSerializerFormat]     // ADD THIS LINE 
    Transaction SubmitTransaction(Transaction transactionIn);

Два примечания: 1) После того, как я сделал это, я увидел намного больше .xsds в моей тестовой клиентской программе прокси (Service Reference), но я не увидел новые классы в моем intellisense. 2) По какой-то причине, пока я не построил проект, я не получил все классы в intellisense (не знаю почему).


person NealWalters    schedule 06.03.2010    source источник


Ответы (4)


Классы, использующие [DataContract], будут сериализованы в очень ограниченную схему. Например, не будет атрибутов, только элементы. Это сделано специально для повышения производительности и совместимости.

В общем, схема, с которой вы, возможно, работаете, может быть намного сложнее. Такая схема не может использоваться с сериализатором контракта данных. Вместо этого вам нужно будет использовать сериализатор XML.

В частности, не редактируйте классы, созданные XSD.EXE. Фактически, вы никогда не должны редактировать сгенерированный код, так как ваши правки будут удалены, как только код будет сгенерирован снова. Эти классы уже должны иметь атрибуты, которые потребуются WCF для работы с ними.

Что произойдет, если вы просто будете использовать их как есть?

person John Saunders    schedule 06.03.2010
comment
1) Когда я генерирую тестовую клиентскую программу, прокси не имеет кода ни для одного из этих 15 классов. Насколько я понимаю, WCF требует, чтобы [DataContract] и [DataMember] правильно отображались. Все элементы меня устраивают. 2) Я полностью согласен с тем, что не хочу менять код, поэтому разместил вопрос. 3) Что нужно искать, чтобы узнать больше о XmlSerializer? Генерирует ли он код C # из файлов .xsd? Возможно, я использовал его на последнем клиенте, но мне нужно получить доступ к моей почте Gmail (заблокированной здесь). - person NealWalters; 06.03.2010
comment
Используйте [XmlSerializerFormat] для каждой операции веб-службы, требующей сериализации XML. Утилита XSD уже сделала за вас всю остальную работу. - person John Saunders; 06.03.2010
comment
Я не был противником, но - похоже, вы упускаете мою точку зрения. У меня есть утвержденный XSD, который мне нужно использовать в WCF как класс C #. Я привык сначала создавать схему, затем веб-сервис C #, а затем строить WSDL. [Я нашел это письмо на Blackberry, а в предыдущей компании использовалось svcutil.exe / serializer: xmlserializer, но это была другая проблема. У нас была проблема из-за того, что сложный класс C # не сериализовался должным образом в BizTalk, который потреблял WCF.] - person NealWalters; 06.03.2010
comment
Я понимаю вашу точку зрения. Используйте классы, созданные XSD.EXE, но вы должны настроить каждую операцию для использования XML-сериализатора, используя атрибут [XmlSerializerFormat] в [OperationContract]. Есть проблемы с этим? Это включит сериализатор XML для этой конкретной операции (метода) веб-службы. - person John Saunders; 06.03.2010
comment
Итак, когда VS2008 вышел с WCF, утилита XSD никогда не была обновлена ​​для поддержки декораторов сериализации WCF? Это правда??? Сегодня мы запустили XSD.exe из 2005 и 2008 годов и сравнили различия кода, сгенерированного C #, который был только .42 против .1432 в номере версии (атрибута System.CodeDom.Compiler.GeneratedCodeAttribute). - person NealWalters; 08.03.2010
comment
Вы спросили, есть ли проблема с этим? Проблема в том, что XSD, вероятно, претерпит несколько изменений в течение следующих нескольких недель, и я ожидаю, что придется перестраивать класс C # много раз. - person NealWalters; 08.03.2010
comment
Еще я изучаю утилиту XSDObjectGen. - person NealWalters; 08.03.2010
comment
Извините, меня наконец осенило. [OperationContract] находится не в сгенерированном C # коде, а в моем файле Ixxxx.cs. Так что мне не нужно менять его каждый раз, когда я регенерирую. См. Сообщение выше к моему исходному вопросу, в котором показан синтаксис. Примечание. XmlSerializerFormat не является частью атрибута OperationContract, это просто другой атрибут. - person NealWalters; 08.03.2010
comment
Извините, фальстарт. Я думал, что получил, но пока нет. Я удалил [DataContract], который я добавил, так что теперь мой сгенерированный .CS нетронут. Я добавил [XmlSerializerFormat] в интерфейс. Тем не менее, мой класс не отображается в прокси-сервере после его восстановления. - person NealWalters; 08.03.2010
comment
Еще раз извини, должно быть, утро понедельника. XmlSerializer помог, но я получал классы с помощью Intellisense, поэтому подумал, что это не сработало. Мне нужно было сделать сборку моей клиентской программы до того, как Intellisense начал работать. Думаю, теперь я счастливый турист. - person NealWalters; 08.03.2010
comment
@Neal: XSD.EXE не имеет отношения к WCF. Это связано со старой технологией сериализации XML. Поскольку сериализация контрактов данных не поддерживает произвольные схемы, WCF может при необходимости использовать сериализацию XML. Для этого необходимо указать WCF использовать сериализатор XML вместо сериализатора контракта данных в каждом конкретном случае. - person John Saunders; 08.03.2010
comment
Прокомментируйте или подтвердите мой новый ответ. - person NealWalters; 16.03.2010

Нил, помимо всех вариантов, которые дал тебе Джон, тебе также следует проверить инструмент WCSF.blue на Codeplex: http://wscfblue.codeplex.com/

Это подход «сначала контракт» к созданию WCF, и один из многих вариантов, которые он предлагает, - создать файл WCF DataContract из вашего XSD:

альтернативный текст

Затем появляется диалоговое окно, в котором вы можете установить множество параметров того, как создать файл класса C # из XSD:

альтернативный текст

Довольно полезно, даже если вы хотите использовать его не более чем для преобразования XSD в классы C #, которые работают как WCF DataContracts :-)

Также см. запись в блоге с дополнительными пояснениями по процессу создания XSD DataContract.

person marc_s    schedule 06.03.2010
comment
Размещенные вопросы в их обсуждении CodePlex здесь: wscfblue.codeplex.com/Thread/View. aspx? ThreadId = 204204 - как работать с XSD, созданным с помощью BizTalk 2006 / R2 в VS2005. - person NealWalters; 08.03.2010
comment
Прокомментируйте или подтвердите мой новый ответ. - person NealWalters; 16.03.2010

Я шокирован тем, что никто не указал мне на эту утилиту, о которой, как мне кажется, я и просил:

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.xsddatacontractimporter.aspx

Я еще не пробовал, но похоже, что XsdDataContractImporter был тем, что я искал, или SVCUTIL с флагом / dataContractOnly.

Я узнал об этом вчера во время собеседования с кандидатом. Она сказала, что сериализация DataContract выполняется быстрее и ее предпочтительнее использовать.

Нил

person NealWalters    schedule 16.03.2010

Re: ваш класс XsdDataContract, упомянутый в вашем продолжении, IMO, это нишевый класс (как и ServiceContractGenerator и т. Д.), Поэтому я не удивлен, что никто не указал вам на него. Вам все равно нужно упаковать его, чтобы сделать его действительно полезным. Я почти уверен, что этот образец кода охватывает только самые простые варианты использования, поэтому я ожидаю, что придется проделать большую работу с ним, чтобы привести его в надлежащее рабочее состояние. . И, как я уже упоминал на форуме WSCF, Svcutil, wscf, xsd.exe и другие используют этот класс и связанные с ним классы в процессе генерации кода.

Что касается производительности сериализатора, в блоге Юсефа Муссауи есть действительно хорошие сообщения о различных сериализаторах и их производительности, особенно http://blogs.msdn.com/youssefm/archive/2009/07/10/comparing-the-performance-of-net-serializers.aspx

Здесь также есть действительно хорошее обсуждение в Connect двух сериализаторов (XS и DCS) и полезный момент, заключающийся в том, что XS по-прежнему является шагом вперед для разработки WSDL / XSD First, поскольку DCS предназначена только для поддержки упрощенной модели программирования и, следовательно, не не поддерживает различные конструкции xml. http://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=451277

Надеюсь, это поможет, Ура, Бенджи

person Santosh Benjamin    schedule 16.03.2010
comment
Спасибо, на прошлой неделе мы несколько дней обсуждали плюсы и минусы DataContract и XmlSerializer. Похоже, наш новый эксперт по WCF считает, что использование XmlSerializer не позволяет в полной мере использовать возможности WCF. Вы думаете, что это правда? Я собираюсь прочитать упомянутые вами блоги. - person NealWalters; 12.04.2010