2014-01-28 11 views
2

Я начал использовать некоторые веб-сервисы, которые имеют ошеломляющее количество избыточности при добавлении в качестве веб-служб в Visual Studio 2012. Вот два WSDL, которые демонстрируют это:как обрабатывать избыточные классы, используемые в веб-службах

http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdl

http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCloseRQ.wsdl

это услуги, чтобы создать новую сессию и закрыть ее, соответственно. Каждая служба имеет свой собственный класс MessageHeader, который, в свою очередь, имеет член, принадлежащий классу MessageData, который переопределяется в каждом сгенерированном прокси. Есть и такие, но я не буду называть их всех.

Это затрудняет, когда я хочу создать вспомогательную функцию, которая устанавливает мой запрос и заполняет все обычные вещи в конверте, такие как отметки времени, аутентификация и т. Д., Поскольку Service1.MessageHeader не является тем же типом, что и Service2 .Заголовок сообщения. Я экспериментировал с утиным набором текста, но, насколько я видел, вложенный характер этого может предотвратить такой подход.

Глядя на WSDL, эти классы определяются как те же пространства имен. Другими словами, в обоих WSDL,, MessageHeader определяется как:

<xsd:import namespace="http://www.ebxml.org/namespaces/messageHeader" schemaLocation="msg-header-2_0.xsd"/> 
... 
<part name="header" element="eb:MessageHeader"/> 

Есть ли какой-нибудь способ сделать VS понять, что это одно и то же в обоих классах и каким-то образом получить его, чтобы отделить их, как общие для обоих? Или это «веб-сервис - это остров»? Мне действительно не нужно создавать отдельный код для каждого типа веб-сервиса, который мне понадобится, поскольку их гораздо больше, чем только этих двух. Но каждый из них использует эти же классы.

Я подумал о том, чтобы пройти и взломать классы прокси. Но помимо моего опасения, что это заставит VS скользить по какой-то передаче, потому что я испортил то, что он делал за кулисами, от которых я никогда не ожидал, что я буду возиться, я бы потерял все автогенерацию, если в WSDL что-то изменится, необходима повторная синхронизация.

Я пробовал это как на C#, так и в Oxygene и сталкивался с теми же проблемами. Я предполагаю, что это будет то же самое на других языках под VS. Кажется, это связано с тем, как он понимает WSDL.

Прежде чем кто-нибудь спросит, я ничего не могу изменить о фактических веб-сервисах. Это совсем другая компания, и не одна, которая будет заинтересована в перепроектировании своей широко используемой системы на основе моих прихотей.

+0

Вы используете веб-ссылки или ссылки на службы? Если последнее, вы можете попробовать нажать «Share types» в расширенном меню. –

+0

Я добавляю его через ссылку «Добавить службу», поэтому последний. Вы имеете в виду вариант «Повторное использование ссылочных сборок»? У меня есть проверка на обоих. Вы пробовали это с этими двумя примерами? Я не уверен, что это просто ничего не делает для этой проблемы, или если она не работает из-за того, как они написали xsd. Я нашел некоторую информацию, что WSCF.blue может быть хорошим вариантом для этого, но еще не пробовал. – jep

ответ

2

Я нашел потенциальное решение этого, и он работает во всех отношениях, я могу сказать. Но я открыт для критики или «лучшего способа» (включая лучший способ сделать это из графического интерфейса).

Я обнаружил, что с помощью следующей команды генерирует правильный «блок» единый тип интерфейса, я хочу со всеми типами совместно:

wsdl.exe /sharetypes /language:CS "http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdl" "http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCloseRQ.wsdl" /o:"SabreWebServices.cs" /n:SabreWebServices 

Это создает C# один. Для Oxygene, я использую:

wsdl.exe /sharetypes /language:OXYGENE "http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdl" "http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCloseRQ.wsdl" /o:"SabreWebServices.pas" /n:SabreWebServices 

FWIW, я использовал WSDL из каталога "c:\Program Files\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools на моей машине.

Я добавил полученный файл-оболочку в свое приложение, и он отлично работал, если немного отличается от оберток, созданных с помощью Add Service Reference. Я действительно предпочитаю синтаксис, созданный немного больше. Он также имел преимущество в создании только одного файла, а не многочисленных, а не наложения на приложение.конфигурации. Если вы хотите изменить конечную точку, вы можете просто установить свойство Url того экземпляра, который вы создаете.

Я пришел к этому решению по телефону this post через this post.