C# 使用具有名称空间的服务使用SOAP

C# 使用具有名称空间的服务使用SOAP,c#,web-services,serialization,soap,C#,Web Services,Serialization,Soap,我正在使用一个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/

我正在使用一个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。它呈现
当您发送该请求时会发生什么?大概它成功了,因为
cmp:NumberType

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


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

我最近听说有一些程序可以区分

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


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


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

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

前缀只是它所代表的名称空间的缩写。在本例中,“cmp”表示{}

当您将此XML加载到DOM文档中时,此DOM中节点的“实际声明”现在是“{}:Number”

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

但是,无论您如何序列化它,它都不会更改其表示的数据。所以

<bla xmlns="http://www.company.com/" /> 在句法上是不同的,但在价值上是相同的

<cmp:bla xmlns:cmp="http://www.company.com/" /> <{http://www.company.com/}:bla />
阅读本文后,是否需要以使用“cmp”作为前缀的格式提供序列化的XML?(因为它是一个soap头,我认为这一要求并不存在),或者我们可以使用任何xml序列化样式,只要我们不更改其表示的数据?(这是W3CXML1.0+名称空间兼容解析器所关心的)

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

如果是要求

您可以将XmlNamespaceManager与XmlSerializer相关联。这允许您为namespaceuri关联设置前缀,然后在对象序列化期间使用这些关联


希望这有帮助,

问题是web服务器使用java,它返回输入错误。Sry,我可以发布此api的详细信息。但是JavaWeb服务器返回输入错误。我可以更改soap请求中发布的xml吗?我刚刚读到,您声明它是一个java服务,当您尝试触发请求时,它确实抛出了一个错误。在使用XmlSerializer路径之前,您是否检查过线路上的内容?你的soap头在那里吗?它是否位于正确的命名空间中(无论前缀如何,请检查与xmlns='xxx'或bla:soapheader xmlns:bla='xxx'关联的命名空间uri)。如果这是一个“已知问题”,您是否与web服务供应商进行了核实? <cmp:bla xmlns:cmp="http://www.company.com/" /> <{http://www.company.com/}:bla />