首页 > 解决方案 > 通过 Web 参考的 Soap 请求中缺少命名空间前缀

问题描述

这是我的设置,我有一个 WSDL 文件,我将它导入到我的应用程序中,它创建了引用,我可以调用它来提出我的请求。一切都很好,只是请求缺少名称空间的前缀。我的请求看起来像这样(通过 SoapUI 捕获)

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
  <ATT_ADDR_VAL_REQ xmlns="http://lsr.att.com/preorder">
     <ADDR_VAL_REQ xmlns="http://lsr.att.com/obf/tML/UOM">
        <HDR>
           <MSG_TIMESTAMP>0001-01-01T00:00:00</MSG_TIMESTAMP>
           <CC>30H</CC>
           <STATE>CA</STATE>
        </HDR>
        <PON>TESTPON</PON>
     </ADDR_VAL_REQ>
  </ATT_ADDR_VAL_REQ>
</soap:Body>
</soap:Envelope>

但是远程系统需要这样的东西,ns1 和 ns2 只是一个 samlpe 前缀可以是任何东西

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
  <ns1:ATT_ADDR_VAL_REQ xmlns:ns1="http://lsr.att.com/preorder">
     <ns2:ADDR_VAL_REQ xmlns:ns2="http://lsr.att.com/obf/tML/UOM">
        <ns2:HDR>
           <ns2:MSG_TIMESTAMP>0001-01-01T00:00:00</ns2:MSG_TIMESTAMP>
           <ns2:CC>30H</ns2:CC>
           <ns2:STATE>CA</ns2:STATE>
        </ns2:HDR>
        <ns2:PON>TESTPON</ns2:PON>
     </ns2:ADDR_VAL_REQ>
  </ns1:ATT_ADDR_VAL_REQ>
</soap:Body>
</soap:Envelope>

ATT_ADDR_VAL_REQ 的外观也仅供参考

Partial Public Class ATT_ADDR_VAL_REQ

    Private aDDR_VAL_REQField As ADDR_VAL_REQ

    '''<remarks/>
    <System.Xml.Serialization.XmlElementAttribute([Namespace]:="http://lsr.att.com/obf/tML/UOM")>  _
    Public Property ADDR_VAL_REQ() As ADDR_VAL_REQ
        Get
            Return Me.aDDR_VAL_REQField
        End Get
        Set
            Me.aDDR_VAL_REQField = value
        End Set
    End Property
End Class

所以我想知道有没有什么地方可以设置系统使用命名空间前缀?

标签: vb.netsoap

解决方案


你的样本

<ns1:ATT_ADDR_VAL_REQ xmlns="http://lsr.att.com/preorder">
  <ns2:ADDR_VAL_REQ xmlns="http://lsr.att.com/obf/tML/UOM">

不是有效的 XML 文档,因为 ns1 和 ns2 未定义。使用前缀时看起来像这样

<ns1:ATT_ADDR_VAL_REQ xmlns:ns1="http://lsr.att.com/preorder">
  <ns2:ADDR_VAL_REQ xmlns:ns2="http://lsr.att.com/obf/tML/UOM">

但意思完全一样

<ATT_ADDR_VAL_REQ xmlns="http://lsr.att.com/preorder">
   <ADDR_VAL_REQ xmlns="http://lsr.att.com/obf/tML/UOM">

所以请求应该在服务器端传递。

我相信你不能影响通过配置或属性使用前缀。它需要编写自己的序列化程序或一些 IEndpointBehavior + IClientMessageInspector 来修改输出。


推荐阅读