【问题标题】:How can I change namespace prefix in this WSDL?如何更改此 WSDL 中的命名空间前缀?
【发布时间】:2009-12-22 04:48:49
【问题描述】:

我正在尝试为预先存在的 Web 服务创建 WSDL。我有一个现有的客户端和现有的服务器,并且我已经使用 Wireshark 捕获了两者都使用的格式。我正在尝试编写一个使用相同格式的新客户端。因此,我试图尽可能地匹配格式,无论它是否正确。我正在使用 XmlSPY 编写一个 WSDL 文件,然后我希望将其带到 C# 并生成接口代码。

到目前为止,这是我的 WSDL:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.ecerami.com/wsdl/HelloService.wsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ecerami.com/wsdl/HelloService.wsdl" name="HelloService">
 <message name="api:create"/>
 <message name="oanda:create">
  <part name="parameter"/>
  <part name="parameter"/>
 </message>
 <portType name="Oanda_PortType">
  <operation name="create">
   <input message="tns:oanda:create"/>
   <output message="tns:api:create"/>
  </operation>
 </portType>
 <binding name="Oanda_binding" type="tns:Oanda_PortType">
  <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
  <operation name="create">
   <soap:operation soapAction="sayHello"/>
   <input>
    <soap:body use="encoded"  namespace="oanda.fxtrade.api"/>
   </input>
   <output>
    <soap:body use="encoded" namespace="oanda.fxtrade.api"/>
   </output>
  </operation>
 </binding>
 <service name="Oanda_service">
  <documentation>WSDL File for Oanda FX Trade API (local SOAP server)</documentation>
  <port name="Oanda_port" binding="tns:Oanda_binding">
   <soap:address location="http://10.0.0.3:18081"/>
  </port>
 </service>
</definitions>

这是我要复制的示例消息。这是原始客户端发出的内容:

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
  <SOAP-ENV:Header/>
  <SOAP-ENV:Body>
    <oanda:create xmlns:oanda="oanda.fxtrade.api">
      <parameter>FXGAME</parameter>
      <parameter></parameter>
    </oanda:create>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

这是 XmlSPY 所说的我的 WSDL 将为同一消息发出的内容:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <SOAP-ENV:Body>
      <m:create xmlns:m="oanda.fxtrade.api">
       <parameter/>
       <parameter/>
      </m:create>
     </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

我现在的问题是 - 我如何匹配原始客户端生成的“oanda:”前缀?这就是所谓的命名空间前缀吗?我生成的代码中的“m:”来自哪里?我可以在本网站的其他示例中找到对此的提及,但至少据我所知,没有使用 WSDL。

感谢您提供的任何帮助。


当我尝试通过 svcutil.exe 运行上述 WSDL 时,我遇到了两个问题。

1) XML 格式不正确,因为您不能有多个具有相同名称的参数。 XMLSpy 也对此有所抱怨,所以我暂时将其重命名为 Parameter1 和 Parameter2。

具体错误是:“指定了多个名为‘参数’的消息部分。每个消息部分必须有一个唯一的名称。”

2) 一旦超过这个,我就会得到这个错误:

“命名空间前缀 'tns:oanda' 未定义。”

所以,再说一遍:如何在 WSDL 文件中更改/添加命名空间定义?

【问题讨论】:

    标签: xml soap wsdl namespaces prefix


    【解决方案1】:

    命名空间前缀无关紧要。根据 XML 的规则,这两个示例是相同的。

    【讨论】:

    • 这可能是真的,但我仍然想更改命名空间前缀。肯定有办法控制它,是吗?
    【解决方案2】:

    命名空间前缀与变量名完全相同。你可以用任何你想要的名字命名空间。

    这类似于下面的java代码:

    在第一个 XML 中:api.fxtrade.onada onada;
    在第二个 XML 中:api.fxtrade.onada m;

    换句话说,第一个 XML 可以读作:
    引用具有变量 onada 的“oanda.fxtrade.api”命名空间,onada 命名空间中的 create 标记将具有一个值为 FXGAME 的参数
    第二个 XML 可以读作:
    引用变量 m 的“oanda.fxtrade.api”命名空间,m 命名空间中的 create 标记,将有一个参数... em>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      相关资源
      最近更新 更多