Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# wcf请求消息中不必要的命名空间前缀_C#_Wcf_Soap_Wsdl_Soapui - Fatal编程技术网

C# wcf请求消息中不必要的命名空间前缀

C# wcf请求消息中不必要的命名空间前缀,c#,wcf,soap,wsdl,soapui,C#,Wcf,Soap,Wsdl,Soapui,我对WCF请求消息名称空间有问题。在每个对象中,我都有一个额外的名称空间前缀。我应该如何修饰一个契约/对象来去掉这些前缀,以使子节点从父节点继承名称空间。在本例中,我使用的是XmlSerializer。 根据wsdl从SOAPUI生成的当前输出: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://somenamespace.com"> <

我对WCF请求消息名称空间有问题。在每个对象中,我都有一个额外的名称空间前缀。我应该如何修饰一个契约/对象来去掉这些前缀,以使子节点从父节点继承名称空间。在本例中,我使用的是XmlSerializer。 根据wsdl从SOAPUI生成的当前输出:

<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>

现在还不清楚您想要实现什么,但是请注意,您正在展示的两个XML并不等效,请不要犹豫,您的第一个XML看起来完全有效

在第二种情况下,肯定无法实现您的模式,并且元素与不在同一名称空间中,名称空间继承仅适用于默认名称空间,如果使用名称空间前缀,则必须在每个对象中使用它

如果您的目标是避免在XML中使用前缀,那么必须将XML放在XML中=http://somenamespace.com 在这个标记中,这样所有的子项都将继承与其父项相同的名称空间

例如,您在问题中显示的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>
请注意,两者都是完全有效的,因此不需要从第一个名称空间前缀中删除名称空间前缀

此外,正如我所说的,您在问题中显示的所需输出肯定无法完成模式定义,因此A是无效的:

<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>
希望这有帮助