【问题标题】:Consuming SOAP with service with name space使用带有名称空间的服务使用 SOAP
【发布时间】:2010-02-05 10:36:13
【问题描述】:

我正在使用一个 SOAP Web 服务,它有命名空间,有些类似于:

<?xml version="1.0" encoding="UTF-8" ?>   
<wsdl:definitions targetNamespace="http://www.company.com/" 
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
    xmlns:company="http://www.company.com/" 
    xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/">
  <wsdl:types>
    <xsd:schema elementFormDefault="qualified" targetNamespace="http://www.company.com/" version="0.1" 
    xmlns:cmp="http://www.company.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

    <xsd:element name="Number" type="cmp:NumberType" />

我的问题是当 .net 序列化对象时,它在 xml 中不包含前缀 cmp。它呈现 &lt;Number.... 而不是 &lt;cmp:Number ...

我能解决什么问题?

【问题讨论】:

    标签: c# web-services serialization soap


    【解决方案1】:

    当您发送该请求时会发生什么?大概是成功了,因为cmp:NumberType的部分

    <xsd:element name="Number" type="cmp:NumberType" />
    

    指的不是元素的名称,而是上面引用的 WSDL 中的类型名称。它是一个复杂类型,否则它会类似于xsd:int。因此,正如我所说,您的代码应该仍然可以工作,特别是如果您将该 WSDL 作为 WebReference 导入到您的 Visual Studio 项目中。

    【讨论】:

    • 问题是web服务器使用java,返回输入错误。
    【解决方案2】:

    我最近听说了区分以下各项的程序

    <Number xmlns="http://www.company.com/" />
    

    <tns:Number xmlns:tns="http://www.company.com/" />
    

    这两个示例在 XML 标准方面是相同的,但是有些程序不遵循标准,而是创建了自己的标准。

    您能发布导致问题的 XML 吗?此外,发布收到的完整错误消息。

    【讨论】:

    • 对不起,我可以发布这个 api 的详细信息。但是 java web 服务器返回输入错误。我可以更改在soap请求中发布的xml吗?
    【解决方案3】:

    元素上使用的前缀仅在前缀声明的范围内有效。换句话说,这个“cmp”前缀只对这个序列化的 XML 有效。

    前缀只不过是它所代表的命名空间的缩写。在这种情况下,“cmp”代表 {http://www.company.com/}。

    当您将此 XML 加载到 DOM 文档中时,此 DOM 中节点的“真实声明”现在是“{http://www.company.com/}:Number”。

    这甚至是一个非常短的命名空间,想象一下平均命名空间及其大小,我认为我们可以同意为什么在序列化任何 XML 文档时使用缩写(在 XML 中称为前缀)是一个好主意。

    但是无论你如何序列化它,它都不会改变它所代表的数据。所以

    在语法上不同,但在值方面与

    相同

    看完这篇,是否真的需要以“cmp”为前缀的格式提供序列化的XML? (因为它是一个肥皂头,我认为这个要求不存在),或者我们可以使用任何 xml 序列化样式,只要我们不更改其表示的数据? (这是符合 W3C XML 1.0+Namespaces 的解析器所关心的)

    如果它不是一个要求,就不要让它成为一个:)

    如果是要求的话;

    您可以将 XmlNamespaceManager 与 XmlSerializer 相关联。这允许您设置前缀到名称空间URI 关联,然后在对象序列化期间使用该关联。

    希望对你有帮助,

    【讨论】:

    • 我刚刚读到你说它是一个 java 服务,当你试图触发你的请求时它确实抛出了一个错误。在走 XmlSerializer 路径之前,您是否检查过线路上的内容?你的肥皂头在吗?它是否在正确的命名空间中(无论前缀如何,检查与 xmlns=´xxx´ 或 bla:soapheader xmlns:bla=´xxx´ 关联的命名空间 uri)。如果这是一个“已知问题”,您是否与网络服务供应商核实过?
    猜你喜欢
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 2018-07-31
    相关资源
    最近更新 更多