wcf请求消息

时间:2015-10-01 11:17:54

标签: c# wcf soap wsdl soapui

我遇到了WCF请求消息命名空间的问题。在每个对象中我都有一个额外的名称空间前缀我应该如何装饰合同/对象以摆脱这些前缀(希望子节点从父节点继承命名空间)。在这种情况下,我使用的是XmlSerializer。 当前输出(从SOAPUI生成,基于wsdl):

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://somenamespace.com">
   <soapenv:Header/>
   <soapenv:Body>
   <ns:InputObject>
     <ns:Data>
        <ns:property1>?</ns:property1>
        <ns:property2>?</ns:property2>
     </ns:Data>
    </ns:InputObject>
  </soapenv:Body>
</soapenv:Envelope>

期望的输出:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://somenamespace.com">
   <soapenv:Header/>
   <soapenv:Body>
       <ns:InputObject>
         <Data>
            <property1>?</property1>
            <property2>?</property2>
         </Data>
      </ns:InputObject>
   </soapenv:Body>
</soapenv:Envelope>

1 个答案:

答案 0 :(得分:0)

目前尚不清楚您要实现的目标,但请注意,您展示的两个XML并不相同(不要犹豫前缀您的第一个xml看起来完全有效)。

在第二个(肯定没有完成您的模式)中,<Data><property>元素与<InputObject>不在同一名称空间中,名称空间继承仅适用于默认名称空间,如果您使用命名空间前缀在每个对象中使用它。

如果您的目标是避免在<InputObject>中使用前缀,那么您必须将xmlns="http://somenamespace.com"放入此标记中,这样所有<InputObject>子项都会继承相同的名称空间。它的父母。

例如,您在问题中显示的这个xml:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://somenamespace.com">
   <soapenv:Header/>
   <soapenv:Body>
   <ns:InputObject>
     <ns:Data>
        <ns:property1>?</ns:property1>
        <ns:property2>?</ns:property2>
     </ns:Data>
    </ns:InputObject>
  </soapenv:Body>
</soapenv:Envelope>

相当于:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
   <InputObject xmlns="http://somenamespace.com">
     <Data>
        <property1>?</property1>
        <property2>?</property2>
     </Data>
    </InputObject>
  </soapenv:Body>
</soapenv:Envelope>

请注意,两者都是等效的完全有效,因此不需要从第一个中删除命名空间前缀......

此外,正如我所说,你想要的输出&#34;您在问题中显示的确定无法完成您的模式定义,因此无效:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://somenamespace.com">
   <soapenv:Header/>
   <soapenv:Body>
       <ns:InputObject>
         <Data>
            <property1>?</property1>
            <property2>?</property2>
         </Data>
      </ns:InputObject>
   </soapenv:Body>
</soapenv:Envelope>

希望这有帮助,