【问题标题】:Sending a SOAP request containing an empty namespace发送包含空命名空间的 SOAP 请求
【发布时间】:2017-09-20 18:27:50
【问题描述】:

我正在尝试通过 SOAP 请求提交数据。 Web 服务中接收到的数据为空,大概是因为我发送的 XML 中的空白 xmlns 命名空间导致数据返回空(例如,TransmissionVersion)。大多数在线资源都建议删除 xmlns = "",但是有没有一种快速的方法可以让服务接受命名空间,而无需在发送请求之前对其进行检查并删除它,就像这里所做的那样?

https://cmatskas.com/changing-soap-message-data-and-namespaces-with-c/

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:efil="http://samplelink.org" xmlns="http://samplelink.org">
   <soapenv:Header/>
   <soapenv:Body>
        <Send xmlns="http://samplelink.org">
            <Transmission>
                <SimplifiedReturnTransmission transmissionVersion="2015V01" xmlns="">
                    <TransmissionHeader>
                        <TransmissionId>TI000024691218803</TransmissionId>
                        <Timestamp>2014-09-07T10:18:26</Timestamp>
                        <Transmitter>
                            <ETIN>67666665</ETIN>
                        </Transmitter>
                        <ProcessType>T</ProcessType>
                        <DocumentCount>1</DocumentCount>
                        <TransmissionPaymentHash>14022.49</TransmissionPaymentHash>
                    </TransmissionHeader>                   
                </SimplifiedReturnTransmission>
            </Transmission>
        </Send>
    </soapenv:Body>
</soapenv:Envelope>

这是界面中的相关代码:

<DataContract()>
<System.Xml.Serialization.XmlRootAttribute("SimplifiedReturnTransmission")>
Public Class SimplifiedReturnTransmissionType
    Private transmissionHeaderField As TransmissionHeaderType
    Private simplifiedReturnDocumentField() As SimplifiedReturnDocumentType  
    Private transmissionVersionField As String

    <DataMember(EmitDefaultValue:=False)>
    <System.Xml.Serialization.XmlElementAttribute("TransmissionHeader")>
    Public Property TransmissionHeader() As TransmissionHeaderType
        Get
            Return Me.transmissionHeaderField
        End Get
        Set(ByVal value As TransmissionHeaderType)
            Me.transmissionHeaderField = value
        End Set
    End Property

    <DataMember(EmitDefaultValue:=False)> <System.Xml.Serialization.XmlAttributeAttribute()>
    Public Property transmissionVersion() As String
        Get
            Return Me.transmissionVersionField
        End Get
        Set(ByVal value As String)
            Me.transmissionVersionField = value
        End Set
    End Property
End Class

【问题讨论】:

  • 尝试使用svcutil.exe 为您生成代理,然后您可以使用生成的类,或者至少能够看到您需要在自己的代码中使用的属性值。跨度>
  • svcutil.exe 不起作用,但我尝试使用 xsd.exe 但它不起作用。我看到的属性值的唯一区别是,这个 Form:=System.Xml.Schema.XmlSchemaForm.Qualified 在声明了一些属性后出现了,但即使将它们放入也没有改变。
  • 另外,自动生成的 vb 文件的 XmlRootAttributes 中有 [Namespace]:="", IsNullable:=false 的实例,但在尝试在服务中运行时会抛出错误。
  • svcutil 的错误是什么?如果源 wsdl 包含 .xsd 文件,您需要将它们与 wsdl 一起使用。
  • 我们这样做了,但我们发现服务不会接受根属性上的空白命名空间,无论是否合格。我们必须将父元素设为根。

标签: wcf soap xml-namespaces datacontract datamember


【解决方案1】:

将带有空白命名空间的元素设为 ElementAttribute 而不是 RootAttribute 解决了该问题。该元素的父元素改为根属性。

<System.Xml.Serialization.XmlElementAttribute("SimplifiedReturnTransmission")>

<System.Xml.Serialization.XmlRootAttribute("Transmission", [Namespace]:="", IsNullable:=False)>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2018-12-23
    • 2023-03-03
    • 2023-04-05
    相关资源
    最近更新 更多