Visual Studio 2013使用有效的wsdl文件创建服务数据源时出错

时间:2014-10-21 21:40:39

标签: web-services soap visual-studio-2013 wsdl service-reference

我一直在编写一个项目,使用几种不同的Web服务来获取运费报价。对于前两个服务,我通过提供服务的.asmx文件的URL来将它们添加为服务数据源没有问题。

对于最近的服务,我只获得link to a wsdl file。我使用wsdl-analyzer.com来验证看起来像completely valid的文件。当我尝试将其作为服务数据源添加到Visual Studio项目时,WSDL失败并显示以下错误消息。

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服务。

然后我开始环顾四周,看看是否有其他方法可以从我给出的内容中添加服务。我发现了this问题,这个问题很相似,但并不完全相同。关于WSDL文件和向Visual Studio添加服务还有其他几个问题,但它们都没有帮助我。

当我尝试使用下载的WSDL文件的本地路径添加服务时,如上面问题的answer receiving the bounty中所建议的那样,尽管有不同的错误,它仍然无法正常工作。

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文件,因为输出几乎相同,并且在Program Files中的Visual Studio下找到了WSDL.exe。

当我尝试将服务添加为Web引用时,我得到以下内容:

Primus Service as Web Reference Error

正如您所看到的,它正确地从WSDL中获取方法签名,但声称已经失败了404并且没有找到任何其他元数据文件。

我决定使用SoapUI来查看该服务是否处于活动状态,以便连接到该服务,并且它没有任何问题。

我希望有一种简单的方法可以修复WSDL文件,因此Visual Studio可以将服务简单地导入到我的项目中,就像我使用其他服务一样。


重要编辑

我已经通过简单地在末尾添加“:annotation”将Definitions元素中的行从上面的行更改为xmlns:xsd="http://www.w3.org/2001/XMLSchema:annotation"来获取要导入的WSDL。

这导致WSDL导入,但是在Reference.cs中没有生成代码,我觉得非常接近于解决这个问题,但是距离很远。我仍然希望有一个简单的变化,我可以让WSDL正确地创建服务引用,并为我生成参考代码,因为我花了一段时间已经尝试在文件中自己编写代码而没有意识到它会当Visual Studio尝试(错误地)重新生成代码时,所有内容都将被删除。


尝试通过SVCUtil.exe运行修改后的WSDL

我首先尝试通过svcutil每个Leandros回答来运行WSDL,因为我无法访问该服务的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.

2 个答案:

答案 0 :(得分:4)

这非常简单,网站上的.wsdl文件 IS 无效,因为它包含一些非法元素,即<xsd:anotation>上的拼写错误。因此,定义类型的xsd模式被拒绝。

修复

  1. 按照指定在本地下载webservicesPrimus.wsdl文件 先前的解决方案
  2. 进行全局搜索和替换 xsd:使用xsd:annotation
  3. 进行anotation
  4. 将更新的文件添加为 服务参考,您将获得一个完全填充的References.cs
  5. 礼貌地联系webService的所有者并指出错误。

答案 1 :(得分:1)

我在第三方公司创建的合同,参考和服务方面遇到了很多问题。它们经常与基础设施问题相关,但我发现有很多次问题影响而不知道代号和配置本身的基础设施团队。

我可以在许多任务中考虑进行一些检查和尝试,我会发布其中的两个,但如果你能给我一些关于它们的结果,我们可以改进以获得解决方案。所以不要把这个作为最后的答案,我只是想先帮忙做一个复杂的诊断。

首次尝试解决方案:

首先,我个人认为合同无效,即使服务在SOAPUI中有效。通过更新,您可以执行以下操作:

创建对旧学校服务的引用。 http://msdn.microsoft.com/es-es/library/aa347733%28v=vs.110%29.aspx

  1. 打开&#34;开发Visual Studio工具&#34;这就像命令行应用程序,如node-js。
  2. 使用&#34; mkdir test&#34;创建一个文件夹在任何你想要的地方
  3. 运行
  4.   

    svcutil.exe http:// url-of-service /service.svc

    如果它可以连接,它将至少创建两个文件:一个.cs,这是你必须映射的代码,第二个是.config文件,用于在app / web.config中附加服务 因此,您可以在代码级别获得所需的一切,以便开始工作。

    如果它无法连接,那么还有另一个问题,与svc本身有关。

    第二次尝试解决方案:

    配置文件是什么?网络怎么样?我在服务器中看到了很多次关闭连接之前的一些奇怪的规则。

    第三次尝试解决方案:

    SOAP UI是否可以生成新合约,因为它可以使用它?我不知道能不能解释自己。如果SOAP UI工作正常,它可以给你使用的合同吗? SOAP UI可能会在不事先通知的情况下自动更正某些内容。


    您是否丢弃了网络/服务问题?