服务引用未加载:找不到具有目标名称空间的模式

时间:2016-03-17 13:17:23

标签: c# web-services soap xsd wsdl

我正在尝试为我的项目添加服务引用,并且我经常遇到同样的错误。

我创建了一个带有SOAP UI的模拟服务似乎很好,然后我尝试向这个模拟服务添加服务引用,并出现错误:

JexlExpression e = jexl.createExpression( "r.header.gender=com.sytrue.objects.Gender.valueOf('FEMALE')" );

在wsdl上导入带有命名空间urn的架构:oasis:names:tc:dss:1.0:core:schema正在加载:

Warning 14  Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension:     System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: Schema with target namespace 'urn:oasis:names:tc:dss:1.0:core:schema' could not be found.
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/esign']/wsdl:portType[@name='EsignServiceSoap11PortType']    

我已经尝试将schemaLocation直接链接到与wsdl相同的文件夹中的文件,将其链接到私有服务器中发布的url,以及发布它的公共uri。

我总是得到同样的错误,我开始觉得我可能会误解问题的根源。

非常感谢任何见解。

更新:我已经注入了urn:oasis:names:tc:dss:1.0:core:我的wsdl文件中的schema完成定义,而不是尝试导入它。当我这样做时,SOAP UI仍然正确地创建了模拟服务,但是,当我尝试添加服务引用时,在服务发现期间抛出此错误:

<wsdl:types>

      <schema xmlns="urn:oasis:names:tc:dss:1.0:core:schema">

           <import namespace="urn:oasis:names:tc:dss:1.0:core:schema" schemaLocation="oasis-dss-core-schema-v1.0-os.xsd"/>

      </schema>

    .....
</wsdl:types>

EDIT2:我在尝试创建代理时使用了Fiddler来检查http流量,如答案所示。在创建过程中,当尝试访问mockService url时,Fiddler上会出现500内部服务器错误,来自服务器的响应是“SOAPAction [null]的操作缺失”和SOAP版本[SOAP 1.2]的body元素[null]。 / p>

目前,这是我用来创建mockService的WSDL。

The document was understood, but it could not be processed.
  - The WSDL document contains links that could not be resolved.
  - DTD is prohibited in this XML document.
Metadata contains a reference that cannot be resolved:    'http://elite8100-3:8088/mockEsignServiceSoap11Binding?WSDL'.
The content type text/html; charset=iso-8859-1 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 455 bytes of the response were: '<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <soap:Body>
    <soap:Fault>
      <soap:Code>
    <soap:Value>Server</soap:Value>
  </soap:Code>
  <soap:Reason>
    <!--1 or more repetitions:-->
    <soap:Text xml:lang="en">Missing operation for soapAction [null] and body element [null] with SOAP Version [SOAP 1.2]</soap:Text>
  </soap:Reason>
</soap:Fault>
  </soap:Body>
</soap:Envelope>'.
The remote server returned an error: (500) Internal Server Error.
If the service is defined in the current solution, try building the solution and adding the service reference again.

我已经下载了每个关联的.xsd并将它们发布在公共服务器上,我也更改了schemaLocations,因此它们指向此公共服务器上的地址,但是,问题似乎与WSDL结构有关。

1 个答案:

答案 0 :(得分:1)

更新前的主要问题必须是您的语法错误。您说<schema xmlns="urn:oasis:names:tc:dss:1.0:core:schema">工具预期<schema xmlns="http://www.w3.org/2001/XMLSchema">的位置。要简单地导入外部XSD文件,上面的默认XML命名空间就可以解决所有这些问题。

架构导入/包含可能非常混乱;对于那些情况,当你把它们放在WSDL中时,正如你所建议的那样,它很容易出错,因为它不是简单的剪切和粘贴的情况。例如,某些工具可能在处理最初基于xsd:include的引用时遇到问题;变色龙包括不能在WSDL中复制;并且你的所有xsd:imports都不能使用schemaLocation属性。

要解决与损坏的引用相关的问题,我强烈建议使用HTTP调试器,例如Fiddler。它至少会告诉你你忘记清理哪些引用,或者你的模拟解决方案没有正确设置的任何HTTP头。

如果上述问题仍然存在问题,则必须发布修改后的WSDL。