将.NET Web Service中的soap前缀更改为soapenv

4

我正在处理一个遗留的 Web 服务,最初使用 Axis 开发的 Java 编写,其响应如下:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <ns1:TransaccionResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://DefaultNamespace">
         <TransaccionReturn xsi:type="xsd:string"><!-- info --></TransaccionReturn>
      </ns1:TransaccionResponse>
   </soapenv:Body>
</soapenv:Envelope>

我正在制作一个.NET Web服务,应该与所有当前的客户端兼容,但是到目前为止,我已经:

<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:TransaccionResponse xmlns:ns1="http://DefaultNamespace">
         <TransaccionReturn><!-- info --></TransaccionReturn>
      </ns1:TransaccionResponse>
   </soap:Body>
</soap:Envelope>

我从一个旧的ASP.NET Web Service项目开始,想知道是否有一种方法可以将soap前缀替换为soapenv?另外,是否有任何方法可以强制Web服务添加xsi:type声明?


我也有同样的问题??有解决方案吗?? - Vishwanath Mishra
@VishwanathMishra,请检查我的答案,我已经成功解决了这个问题。 - Julián Chamalé
在哪里写将SOAP转换为SOAPENV? - Vishwanath Mishra
实际上,该前缀并未添加到响应中,但它确实是有效的,并且可以被Java客户端无问题地识别。 - Julián Chamalé
1个回答

0
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
Imports System.Web.Services.Description
Imports System.Xml.Serialization
Imports System.IO

<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class ExpedientesService
    Inherits System.Web.Services.WebService

    Public Sub New()
        MyBase.New()
    End Sub

    <WebMethod()> _
    <SoapDocumentMethod("", _
                        RequestNamespace:="http://DefaultNamespace", _
                        ResponseNamespace:="http://DefaultNamespace", _
                        ParameterStyle:=SoapParameterStyle.Bare)> _
    Public Function llamarWS( _
    <XmlElement("Transaccion", Namespace:="http://DefaultNamespace")> ByVal tr As Transaccion) As _
    <XmlElement("TransaccionResponse")>  _
    RespuestaXML
          Return New RespuestaXML(String.format("You sended: '{0}' '{1}' '{2}'", tr.transaccion, tr.usuario, tr.password))
    End Function

End Class

'HERE THERE IS A CLASS DECLARATION FOR THE INPUT PARAMETERS OF THE WEB SERVICE
Public Class Transaccion
    'CHECK THE DECLARATION OF THE XML NODE AND ITS NAMESPACE
    <XmlElement("transaccion", Namespace:="")> _
    Public transaccion As String

    <XmlElement("usuario", Namespace:="")> _
    Public usuario As String

    <XmlElement("password", Namespace:="")> _
    Public password As String

    Public Sub New()
        Me.transaccion = "0"
        Me.usuario = String.Empty
        Me.password = String.Empty
    End Sub

    Public Sub New(ByVal transaccion As String, ByVal usuario As String, ByVal password As String)
        Me.transaccion = transaccion
        Me.usuario = usuario
        Me.password = password
    End Sub

    'HERE YOU DECLARE THE NAMESPACES FOR THE XML ELEMENT
    <XmlNamespaceDeclarations()> _
    Public Property xmlns() As XmlSerializerNamespaces
        Get
            Dim xsn As New XmlSerializerNamespaces()
            xsn.Add("def", "http://DefaultNamespace")

            Return xsn
        End Get
        ' needed for xml serialization 
        Set(ByVal value As XmlSerializerNamespaces)
        End Set
    End Property
End Class

'HERE THERE IS A CLASS DECLARATION FOR THE OUTPUT RESPONSE
Public Class RespuestaXML
    'THIS IS THE SAME AS THE INPUT PARAMETER, THE NODE NAME AND ITS NAMESPACE
    <XmlElement("TransaccionReturn", Namespace:="")> _
    Public Body As String

    Public Sub New()
        Me.Body = "##"
    End Sub

    Public Sub New(ByVal StringReturn As String)
        Me.Body = StringReturn
    End Sub

    'HERE IS THE TRICK, DECLARE THE NAMESPACES FOR THE RESPONSE    
    <XmlNamespaceDeclarations()> _
    Public Property xmlns() As XmlSerializerNamespaces
        Get
            Dim xsn As New XmlSerializerNamespaces()
            xsn.Add("ns1", "http://DefaultNamespace")

            Return xsn
        End Get
        ' needed for xml serialization 
        Set(ByVal value As XmlSerializerNamespaces)
        End Set
    End Property
End Class

当写转换soap到soapenv的代码时,我无法理解你的代码,请您能否查看我的问题:http://stackoverflow.com/questions/27957656/asmx-service-namespace-prefix-in-response-soap - Vishwanath Mishra
此代码为Java客户端创建一个可工作的SOAP响应,而无需对其进行任何更改。 - Julián Chamalé

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接