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