Ошибка Visual Studio 2013 при создании источника данных службы с допустимым файлом wsdl

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

Для последней службы мне дали только ссылку на файл wsdl. Я использовал wsdl-analyzer.com для проверки файла, который, кажется, полностью действительный. Однако WSDL завершается с ошибкой с приведенным ниже сообщением об ошибке, когда я пытаюсь добавить его в проект Visual Studio в качестве источника данных службы.

There was an error downloading 'http://api.shipprimus.com/webservicesPrimus.wsdl/_vti_bin/ListData.svc/$metadata'.

The request failed with HTTP status 404: Not Found.

Metadata contains a reference that cannot be resolved: 'http://api.shipprimus.com/webservicesPrimus.wsdl'.

The content type text/plain of the response message does not match the content type of the binding (application/soap+xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. 

The first 1024 bytes of the response were:

'<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:tns="http://api.shipprimus.com" xmlns:xsd1="http://api.shipprimus.com" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/"  targetNamespace="http://api.shipprimus.com">
<!-- TYPES -->
<wsdl:types>
    <xsd:schema targetNamespace="http://api.shipprimus.com">
        <!-- GetRatesRequest -->
        <xsd:element name="GetRatesRequest">
            <xsd:complexType>
                <xsd:sequence>     
                    <xsd:element name="Username" type="xsd:string"/>
                    <xsd:element name="Password" type="xsd:string"/>
                    <xsd:element name="Carrier" minOccurs="0" type="xsd:string"/>
                    <xsd:element name="OriginZipCode" type="xsd:string"/>
                    <xsd:element '.

If the service is defined in the current solution, try building the solution and adding the service reference again.

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

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

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

The document at the url file:///C:/Users/isellar/Downloads/webservicesPrimus.wsdl was not recognized as a known document type.
The error message from each known type may help you fix the problem:

- Report from 'WSDL Document' is 'There is an error in XML document (364, 19).'.
- The element was not expected in this context:
<xsd:anotation xmlns:xsd='http://www.w3.org/2001/XMLSchema'>..</xsd:anotation>.
Expected elements: http://www.w3.org/2001/XMLSchema:annotation.
If the service is defined in the current solution, try building the solution and adding the service reference again.

Он ссылается на то, что я считаю номером строки, хотя я не особенно знаком с выводом «документа WSDL», что бы это ни было. Однако ни в строке 364, ни в строке 19 файла нет элемента <xsd:anotation>.

Я также попытался запустить файл через WSDL.exe, как предполагает другой ответ на приведенный выше вопрос. При этом я получил ошибку, аналогичную той, которую я получил от Visual Studio. Я предполагаю, что Visual Studio просто использует WSDL.exe для обработки файлов WSDL, поскольку выходные данные были почти идентичными, а WSDL.exe находится в Visual Studio в Program Files.

Когда я пытаюсь добавить службу в качестве веб-ссылки, я получаю следующее:

Primus Service as Web Reference Error

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

Я решил проверить, была ли служба вообще активна, используя SoapUI для подключения к службе, и она работала без проблем. .

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


Важное изменение

Я получил WSDL для импорта, изменив строку в элементе «Определения» с того, что указано выше, на xmlns:xsd="http://www.w3.org/2001/XMLSchema:annotation", просто добавив «: аннотацию» в конец.

Это привело к импорту WSDL, но без сгенерированного кода в Reference.cs, я чувствую, что очень близок к решению этой проблемы, но все же так далеко. Я все еще надеюсь, что есть простое изменение, в котором я могу заставить WSDL правильно создать ссылку на службу и сгенерировать код ссылки для меня, поскольку я уже потратил некоторое время, пытаясь написать код самостоятельно в файле, не понимая, что это будет все будут стерты, когда Visual Studio попытается (неправильно) восстановить код.


Попытка запустить модифицированный WSDL через SVCUtil.exe

Сначала я попытался запустить WSDL через svcutil для ответа Leandros, поскольку у меня не было доступа к файлу SVC для службы. При первом запуске было получено то же сообщение об ошибке, что и во втором поле кода выше. Я также попытался запустить модифицированный WSDL, который изначально импортировался, но не генерировал код из приведенного выше. Это дало мне следующую ошибку.

Error: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: Schema with target namespace 'http://api.shipprimus.com' could not be found.
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://api.shipprimus.com']/wsdl:portType[@name='WebservicePrimusServicePort']


Error: Cannot import wsdl:binding
Detail: There was an error importing a wsdl:portType that the wsdl:binding is dependent on.
XPath to wsdl:portType: //wsdl:definitions[@targetNamespace='http://api.shipprimus.com']/wsdl:portType[@name='WebservicePrimusServicePort']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://api.shipprimus.com']/wsdl:binding[@name='WebservicePrimusSoapBinding']


Error: Cannot import wsdl:port
Detail: There was an error importing a wsdl:binding that the wsdl:port is dependent on. XPath to wsdl:binding: //wsdl:definitions[@targetNamespace='http://api.shipprimus.com']/wsdl:binding[@name='WebservicePrimusSoapBinding']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://api.shipprimus.com']/wsdl:service[@name='WebservicePrimus']/wsdl:port[@name='WebservicePrimusServicePort']


Generating files...
Warning: No code was generated.
If you were trying to generate a client, this could be because the metadata documents did not contain any valid contracts or services or because all contracts/services were discovered to exist in /reference assemblies. Verify that you passed all the meta data documents to the tool.

Warning: If you would like to generate data contracts from schemas make sure to use the /dataContractOnly option.

person Spaceman Spiff    schedule 21.10.2014    source источник
comment
Вы пытались сгенерировать код с помощью svcutils?   -  person Leandro Bardelli    schedule 02.11.2014
comment
похожий вопрос.   -  person Spaceman Spiff    schedule 04.11.2014
comment
Получите копию пользовательского интерфейса SOAP и укажите ее на WSDL. Я бы посоветовал вам запустить тест на соответствие WSI на WSDL, похоже, что пространства имен перепутались. Пользовательский интерфейс SOAP необходим для тестирования WSDL.   -  person Namphibian    schedule 05.11.2014
comment
Я кратко упомянул, что использовал для этого SoapUI. Я только что выполнил соответствие WS-I на WSDL, и, похоже, все прошло без проблем.   -  person Spaceman Spiff    schedule 05.11.2014


Ответы (2)


Это довольно тривиально, файл .wsdl в Интернете ЯВЛЯЕТСЯ недействительным, так как он содержит некоторые недопустимые элементы, например опечатку в <xsd:anotation>. Таким образом, схема xsd, определяющая типы, отклоняется.

Чинить

  1. Загрузите файл webservicesPrimus.wsdl локально, как указано в предыдущем решении.
  2. Выполните глобальный поиск и замените xsd:anotation на xsd:annotation.
  3. Добавьте этот обновленный файл в качестве ссылки на службу, вы получите полностью заполненный файл References.cs.
  4. В качестве любезности свяжитесь с владельцем веб-сервиса и укажите на ошибку.
person tolanj    schedule 06.11.2014
comment
Вау, не ожидал. Я полагаю, мне следовало изучить файл немного более внимательно. - person Spaceman Spiff; 06.11.2014
comment
@Ian Sellar, сообщение об ошибке при доступе к wsdl в Интернете было довольно загадочным, что само по себе является проблемой. - person tolanj; 06.11.2014
comment
Очень даже, я думаю, это то, что бросило меня. До вашего решения мы пытались заставить поставщика обновить свой контент для файла с text/html на application/soap+xml, чтобы посмотреть, поможет ли это. - person Spaceman Spiff; 06.11.2014

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

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

Первая попытка решения:

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

Создайте ссылку на сервис как на старую школу. http://msdn.microsoft.com/es-es/library/aa347733%28v=vs.110%29.aspx

  1. Откройте «Инструмент разработки Visual Studio», который похож на приложение командной строки, такое как node-js.
  2. Создайте папку с «mkdir test» в любом месте.
  3. Бегать

svcutil.exe http:// URL-адрес службы /service.svc

Если он может подключиться, он создаст как минимум два файла: один .cs, который представляет собой код, который вы должны сопоставить, а второй — файл .config для подключения службы в вашем приложении/web.config. Таким образом, у вас есть все, что вам нужно. на уровне кода, чтобы начать работу.

Если он НЕ может подключиться, то есть другая проблема, связанная с самим svc.

Вторая попытка решения:

Что с файлом конфигурации? Что с сетью? Я слишком много раз видел закрытые соединения раньше времени по каким-то странным правилам на серверах.

Третья попытка решения:

Может ли пользовательский интерфейс SOAP создать новый контракт по мере его использования, чтобы вы могли его использовать? Я не знаю, могу ли я объяснить себя. Если пользовательский интерфейс SOAP работает нормально, может ли он предоставить вам контракт, который использует? Вероятно, SOAP UI автоматически исправляет что-то без предварительного уведомления.


Вы вообще отказались от проблем с сетью/обслуживанием?

person Leandro Bardelli    schedule 02.11.2014
comment
Единственная проблема в том, что у меня нет доступа к файлу svc, все, к чему у меня есть доступ, это WSDL, о котором я упоминал выше. Вы можете легко повторить шаги, которые я прошел, попытавшись импортировать wsdl самостоятельно, используя ссылку, указанную в начале вопроса. Я только что попытался запустить WSDL через программу svcutil и получил то же сообщение об ошибке из второго поля вопроса. - person Spaceman Spiff; 04.11.2014
comment
Когда я попытался запустить его с измененным wsdl, который изначально был импортирован, я получил новую ошибку, которая теперь была добавлена ​​​​к ответу. - person Spaceman Spiff; 04.11.2014
comment
Ммммм, попробую сгенерировать отсюда. А пока предлагаю попробовать связаться с ответственным за сервис, не думаю, что он работает должным образом. - person Leandro Bardelli; 04.11.2014
comment
@IanSellar Я пробовал все варианты, которые я знаю, и я не хочу быть претенциозным, но я не думаю, что какой-либо другой вариант даст другой ответ, я боюсь, что сервис неправильный или, по крайней мере, контракт. В более подробном ответе, который я получаю, говорится, что XML плохо отформатирован, а схема неверна. (как твой ответ) - person Leandro Bardelli; 04.11.2014
comment
Хорошо, спасибо за попытку, я свяжусь с людьми, отвечающими за службу, и посмотрю, смогу ли я получить больше информации. - person Spaceman Spiff; 04.11.2014
comment
Np, если вы можете получить информацию или служба повторно развернута, но вы по-прежнему не можете подключиться к какой-либо другой ошибке, обновите свой вопрос и прокомментируйте - person Leandro Bardelli; 04.11.2014
comment
Я просто думаю о третьей идее... чтобы избежать технического конфликта (я знаю, как они бывают) - person Leandro Bardelli; 05.11.2014
comment
Я изучил это, к сожалению, инструмент, который SoapUI использует для генерации кода C#, тот же, что и Visual Studio, поэтому он выдает точно такие же ошибки. В настоящее время я ищу, могу ли я получить код для генерации другого языка через SoapUI. - person Spaceman Spiff; 05.11.2014
comment
Кажется, он отлично сгенерировался в java с использованием Axis2. Мы можем просто использовать это, чтобы избежать хлопот, связанных с написанием XML-сериализации вручную. - person Spaceman Spiff; 05.11.2014