Устранить неоднозначность типов при ссылках на несколько веб-сервисов в C # - PullRequest
4 голосов
/ 22 апреля 2009

В настоящее время я разрабатываю веб-приложение на основе c #, которое вызывает некоторые веб-сервисы. Я импортировал три разных WSDL из провайдера в мой проект WebApplication3 (ссылки -> добавить веб-ссылку). В средстве просмотра классов они выглядят так:

WebApplication3.com.provider.webservices1
WebApplication3.com.provider.webservices2
WebApplication3.Properties

Очевидно, первый и второй WSDL имеют повторяющиеся функции (это правильное имя?)
Если я добавлю в свой Default.aspx.cs следующее, используя:

использование WebApplication3.com.sabre.webservices1;
использование WebApplication3.com.sabre.webservices2;
использование WebApplication3.Properties;


а затем попробуйте использовать:

MessageHeader msgHeader = новый MessageHeader ();
в моем пространстве имен WebApplication3 я получаю сообщение об ошибке

"Неоднозначная ссылка между WebApplication3.com.provider.webservices1 и WebApplication3.com.provider.webservices2"

Я думаю, это потому, что он объявлен в обоих WSDL? Как я могу это исправить, чтобы я мог использовать это?

Спасибо, и извините, если вопрос глупый!

Ответы [ 3 ]

5 голосов
/ 22 апреля 2009

попробуйте ссылаться на MessageHeader, используя его полное пространство имен. например.

WebApplication3.com.provider.webservices1.MessageHeader msgHeader = new 
WebApplication3.com.provider.webservices1.MessageHeader()

для краткости вы можете попробовать

using MessageHeader = WebApplication3.com.provider.webservices1.MessageHeader

который позволит вам использовать

MessageHeader msgHeader = new MessageHeader() 

где MessageHeader из пространства имен webservices1

0 голосов
/ 22 апреля 2009

Полностью укажите имя класса с пространством имен.

WebApplication3.com.sabre.webservices1.MessageHeader msgHeader = new WebApplication3.com.sabre.webservices1.MessageHeader();
0 голосов
/ 22 апреля 2009

Казалось бы, вы импортировали один и тот же WSDL дважды - или, по крайней мере, некоторые типы, используемые обоими, одинаковы. Возможно, вы сможете устранить неоднозначность между двумя одноименными типами, не импортируя оба пространства имен веб-ссылки или используя псевдоним пространства имен.

Не могли бы вы опубликовать фактический фрагмент кода, а также указать URL-адреса, которые вы импортировали с помощью "Добавить веб-ссылку"? Кроме того, какую версию Visual Studio вы используете и на какую версию .Net Framework вы нацеливаетесь?

РЕДАКТИРОВАТЬ - продолжение на основе информации, предоставленной Питером в комментарии

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

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

<definitions targetNamespace="https://webservices.sabre.com/websvc">
  <types>
    <xsd:schema>
    <xsd:import namespace="http://www.opentravel.org/OTA/2002/11" schemaLocation="SessionCreateRQRS.xsd"/>
    <xsd:import namespace="http://www.ebxml.org/namespaces/messageHeader" schemaLocation="msg-header-2_0.xsd"/>
    ...

http://webservices.sabre.com/wsdl/sabreXML1.0.00/tpf/OTA_AirAvailLLS1.1.1RQ.wsdl

<definitions targetNamespace="https://webservices.sabre.com/websvc">
  <types>
  <xsd:schema>
    <xsd:import namespace="http://webservices.sabre.com/sabreXML/2003/07" schemaLocation="OTA_AirAvailLLS1.1.1RQRS.xsd"/>
    <xsd:import namespace="http://www.ebxml.org/namespaces/messageHeader" schemaLocation="msg-header-2_0.xsd"/>
    ...

Последняя строка в каждом файле WSDL показывает причину конфликта имен типов - один и тот же файл XSD импортируется каждым файлом WSDL, очевидно, потому что оба используют один и тот же тип. Когда вы создаете веб-ссылку на каждый файл WSDL, Visual Studio проверяет WSDL и генерирует класс, который соответствует импортированной схеме msg-header-2_0.xsd .

К сожалению, Visual Studio не может сказать, что схема в каждой отдельной ссылке WSDSL действительно имеет один и тот же тип, и поэтому она должным образом импортирует каждый и генерирует отдельный класс для каждого. Хотя каждый из сгенерированных классов имеет одно и то же имя, каждый определяется в своем собственном уникальном пространстве имен, которое соотносится с каждым из файлов WSDL.

Итак, вот почему решение, принятое вами для вашего вопроса, работает - либо указав полное имя one типов работ, либо используя псевдоним для one типов внутри один определенного пространства имен.

Другим решением было бы исправить две веб-ссылки для совместного использования одного типа MessageHeader. Это можно сделать вручную, однако вам придется повторять ручное редактирование каждый раз, когда вы обновляете ссылку на веб-службу, поэтому я бы не рекомендовал это делать. Кроме того, вероятно, лучше использовать правильный тип MessageHeader , определенный для каждой службы, несмотря на тот факт, что они одинаковы. Итак, я бы создал два с использованием псевдонимов , если вы предполагаете, что собираетесь вызывать обе службы из одного и того же исходного файла:

using MessageHeader1 = WebApplication3.com.sabre.webservices1.MessageHeader;
using MessageHeader2 = WebApplication3.com.sabre.webservices2.MessageHeader;

Я бы использовал MessageHeader1 с любой службой, на которую вы ссылались в пространстве имен WebApplication3.com.sabre.webservices1 , а также MessageHeader2 с другой.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...