Web Reference发起Soap请求时缺少命名空间前缀的问题咨询
解决SOAP请求缺少命名空间前缀的问题
针对你遇到的这个问题——.NET生成的Web Reference发出的SOAP请求没有命名空间前缀,而远程系统要求带前缀的格式——有几个可行的解决方案,我结合你的代码示例来一步步说明:
方法1:通过Partial Class扩展添加命名空间前缀属性
因为你的类是Partial Public Class,我们可以在单独的代码文件里扩展这些类,添加XmlRoot或XmlElement属性来指定前缀,不需要修改自动生成的代理代码(避免重新生成WSDL时丢失修改)。
步骤1:扩展ATT_ADDR_VAL_REQ类
Imports System.Xml.Serialization <XmlRoot(Namespace:="http://lsr.att.com/preorder", Prefix:="ns1")> Partial Public Class ATT_ADDR_VAL_REQ End Class
步骤2:扩展ADDR_VAL_REQ及内部类
同样地,给嵌套的类和属性指定对应的前缀:
<XmlType(Namespace:="http://lsr.att.com/obf/tML/UOM", Prefix:="ns2")> Partial Public Class ADDR_VAL_REQ <XmlElement(Prefix:="ns2")> Public Property HDR As HDR <XmlElement(Prefix:="ns2")> Public Property PON As String End Class <XmlType(Namespace:="http://lsr.att.com/obf/tML/UOM", Prefix:="ns2")> Partial Public Class HDR <XmlElement(Prefix:="ns2")> Public Property MSG_TIMESTAMP As DateTime <XmlElement(Prefix:="ns2")> Public Property CC As String <XmlElement(Prefix:="ns2")> Public Property STATE As String End Class
这样,当XmlSerializer序列化这些对象时,会自动给每个元素加上你指定的ns1、ns2前缀,完全符合远程系统的期望格式。
方法2:手动序列化时指定XmlSerializerNamespaces
如果你需要更灵活的控制(比如动态修改前缀名称),可以在序列化请求对象时手动传入XmlSerializerNamespaces对象,显式映射前缀和命名空间:
' 1. 创建请求对象并填充数据 Dim addrReq As New ATT_ADDR_VAL_REQ() addrReq.ADDR_VAL_REQ = New ADDR_VAL_REQ() With { .HDR = New HDR() With { .MSG_TIMESTAMP = DateTime.Parse("0001-01-01T00:00:00"), .CC = "30H", .STATE = "CA" }, .PON = "TESTPON" } ' 2. 创建命名空间映射 Dim nsMap As New XmlSerializerNamespaces() nsMap.Add("ns1", "http://lsr.att.com/preorder") nsMap.Add("ns2", "http://lsr.att.com/obf/tML/UOM") ' 3. 手动序列化请求 Dim serializer As New XmlSerializer(GetType(ATT_ADDR_VAL_REQ)) Using sw As New StringWriter() serializer.Serialize(sw, addrReq, nsMap) Dim formattedRequest As String = sw.ToString() ' 这里可以将formattedRequest作为SOAP Body的内容发送给服务端 End Using
如果使用自动生成的Web代理类,你可能需要修改代理类的代码,让它在序列化时使用这个命名空间映射(不过方法1的Partial Class方式更友好,无需修改生成代码)。
注意事项
- 前缀名称(
ns1、ns2)可以任意命名,只要对应的命名空间和远程系统要求一致即可。 - 确保所有嵌套的元素(比如HDR下的MSG_TIMESTAMP、CC等)都指定了正确的前缀,否则会出现部分元素无前缀的情况。
内容的提问来源于stack exchange,提问作者MisterniceGuy
相关产品推荐
相关产品推荐

