xsd.exe - схема класса - для использования с WCF - PullRequest
6 голосов
/ 06 марта 2010

Я создал схему в качестве согласованного интерфейса между нашей компанией и внешней компанией. Сейчас я создаю веб-сервис 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 в моей тестовой клиентской программе proxy (Service Reference), но я не увидел новые классы в моем intellisense. 2) По какой-то причине, пока я не сделал сборку проекта, я не получил все классы в intellisense (не знаю почему).

Ответы [ 4 ]

5 голосов
/ 06 марта 2010

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

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

alt text

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

alt text

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

Также см. Это сообщение в блоге для получения дополнительных объяснений процесса генерации XSD DataContract.

4 голосов
/ 06 марта 2010

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

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

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

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

3 голосов
/ 16 марта 2010

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

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

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

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

Нил

1 голос
/ 16 марта 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

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

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

...