Невозможно создать ShareLibrary с контрактом данных с помощью SVCUTIL

Случай: у меня есть набор файлов xsd, которые определяют общие типы, используемые в определениях WSDL (Header, ApplicationError). Каждый веб-сервис добавляет рядом с конкретными типами сервиса один или несколько из этих общих типов.

При создании прокси для служб я продолжаю получать копии этих общих типов для каждого прокси службы, поэтому я желаю поместить их в общую библиотеку и использовать / ссылку для включения этих типов. Я не мог заставить это работать.

Во-первых, генерация прокси и включение всех * .xsd нормально работает, и контракты генерируются. Тогда использование svcutil per xsd с параметром / dconly не работает. Оба / XmlSerializer как / DataContractSerializer. Работает только / importXmlType (или xsd.exe).

Затем, если я помещаю их в проект класса, добавляю сгенерированный код, компилирую и использую его для параметра / reference, я все равно получаю код, сгенерированный для этих типов.

Даже если я использую классы, созданные для прокси, они все равно не распознаются svcutil.

Кто-нибудь имеет опыт работы с этим шаблоном и, возможно, сталкивался с такими же проблемами?

Сообщения об ошибках для XmlSerializer как DataContractSerializer svcutil / dconly / ser: XmlSerializer ApplicatieFout-v0200-b03.xsd

Ошибка: введите «ApplicatieFout» в пространстве имен «http://schemas.customer.nl/ApplicatieFout-v0200», который не может быть импортирован. Форма для элемента FoutCode должна быть квалифицирована. Или измените схему, чтобы типы можно было сопоставить с типами контрактов данных или использовать ImportXmlType или использовать другой сериализатор.

Если вы используете параметр / dataContractOnly для импорта типов контрактов данных и получаете это сообщение об ошибке, рассмотрите возможность использования вместо этого xsd.exe. Типы, сгенерированные xsd.exe, могут использоваться в Windows Communication Foundation после применения атрибута XmlSerializerFormatAttribute в вашем контракте на обслуживание. В качестве альтернативы рассмотрите возможность использования параметра / importXmlTypes для импорта этих типов как типов XML для использования с атрибутом DataContractFormatAttribute в контракте службы.


person martijnvanschie    schedule 27.05.2012    source источник


Ответы (1)


В рамках нашей службы поддержки мы довольно часто видим запросы, подобные вашему, которых достаточно, чтобы выявить закономерность. Не видя фактических XSD и WSDL, трудно (для кого-либо) сказать, столкнулись ли вы с ошибкой продукта или чем-то еще.

Однако за эти годы я узнал, что в целом инструменты, работающие с XSD и привязкой кода, всегда ограничены; Чтобы обойти эти ограничения, решение состоит в том, чтобы начать с тщательного планирования содержимого XSD и того, как WSDL должны использовать это содержимое. Будет проще, если я буду контролировать процесс генерации WSDL и XSD; когда я «наследую» или «перенимаю» чужие, я применяю свой собственный рефакторинг.

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

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
    targetNamespace="http://services.paschidev.com/wrapper/usecase_a/1/" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:import namespace="http://services.paschidev.com/service_abc/1/" location="AbcService.wsdl" />
  <wsdl:import namespace="http://services.paschidev.com/service_xyz/1/" location="XyzService.wsdl" />
  <wsdl:types />
</wsdl:definitions>

Пропустите это через свою утилиту (успешно протестировано с помощью Visual Studio 2010, команда Добавить ссылку на службу), и все готово.

Мелкий шрифт ... Чтобы все это работало с высокой вероятностью успеха, все WSDL, которые вы хотите объединить, должны следовать этому правилу: общий XSD должен поступать из общих источников.

Если службе Abc требуется {urn:paschidev-com:xsd:common:1}something, а Xyz то же самое, то {urn:paschidev-com:xsd:common:1}something должен исходить из одного и того же исходного URI для обоих WSDL.

Тест для меня довольно прост: я использую QTAssistant (я связан с ним) Extract XSD, указав ее на оболочку WSDL. Когда будет предложено, я разрешаю ему создать проект XSR; если коллекция, созданная из сгенерированных XSD, компилируется нормально, это означает, что нет повторяющихся определений XSD. Если компиляция выдает «уже определенные» ошибки, отчет сообщает мне, какой компонент XSD дублирован, т. Е. Получен из двух или более разных исходных Uris. Я реорганизую каждый компонент, чтобы сохранить один исходный URI; затем попробуйте еще раз.

Иногда, даже если я правильно понимаю XSD, svcutil или xsd все равно могут подавиться; если это произойдет, значит, это что-то не связанное с оболочкой; он проявил бы себя даже без этой оболочки. Это означает, что всегда полезно убедиться, что до того, как произойдет какой-либо рефакторинг, каждый отдельный WSDL работает сам по себе.

person Petru Gardea    schedule 27.05.2012
comment
Проблема, с которой я сейчас сталкиваюсь, заключается в том, что svcutil не может генерировать контракты данных из отдельных xsd, но может сгенерировать прокси-класс из стены, который фактически ссылается на те же самые xsd. Есть идеи по этому поводу? - person martijnvanschie; 01.06.2012
comment
Есть ли способ поделиться ошибкой и командной строкой? - person Petru Gardea; 01.06.2012
comment
Это уже в заключительной части поста. Я поставил пример командной строки с ApplicatieFout.xsd. Этого достаточно? - person martijnvanschie; 03.06.2012