Я пишу проект, чтобы использовать несколько различных веб-сервисов для получения котировок доставки. Для первых двух служб я без проблем добавил их в качестве источника данных службы, указав 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.
Когда я пытаюсь добавить службу в качестве веб-ссылки, я получаю следующее:
Как вы можете видеть, он правильно получает сигнатуры методов из 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.