VB.NET и Java Web Service - Добавление элемента Header не дает ожидаемых результатов - PullRequest
0 голосов
/ 25 января 2012

У меня много головной боли из-за проблемы, описанной в заголовке этой темы. Я не очень хорошо разбираюсь в веб-сервисах, и я имею дело с одним, разработанным на Java. Для этого веб-сервиса требуется элемент Header с именем Token со значением (зашифрованная строка). Мне удалось добавить этот «токен», но служба его не принимает.

Это запрос xml, который генерирует мой прокси-вызов (прокси-класс, созданный с помощью WSDL.EXE и модифицированный для принятия внешнего класса SoapHeader, который я написал для добавления заголовка в запрос):

<soap:Envelope>
    <soap:Header>
        <TokenHeader soap:actor="http://schemas.xmlsoap.org/soap/actor/next">
            <Token>[TOKEN VALUE]</Token>
        </TokenHeader>
    </soap:Header>
    <soap:Body>
    </soap:Body>
</soap:Envelope>

и это то, чего хотят веб-сервисы (это запрос xml, сделанный клиентом java tyest):

<soapenv:Envelope>
    <soapenv:Header>
        <ns1:Token soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0">
            [TOKEN VALUE]
        </ns1:Token></soapenv:Header>
    <soapenv:Body>
    </soapenv:Body>
</soapenv:Envelope>

Это код, который я написал:

Imports System.Web.Services
Imports System.Web.Services.Protocols

<System.Xml.Serialization.XmlRoot(Namespace:=[WSDL NAMESPACE])> _
Public Class TokenHeader
    Inherits SoapHeader

    <System.Xml.Serialization.XmlElement("Token", Namespace:=[WSDL NAMESPACE])> _
    Public Token As String

    Public Sub New()
        MyBase.New()
        Me.Actor = "http://schemas.xmlsoap.org/soap/actor/next"
    End Sub
End Class    

и это фрагмент кода прокси-класса, в котором я объявил токен

<System.Web.Services.Protocols.SoapDocumentMethodAttribute("", Use:=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle:=System.Web.Services.Protocols.SoapParameterStyle.Bare)> _
<WebMethod(), SoapHeaderAttribute("TokenHeader", Direction:=SoapHeaderDirection.In)> _
Public Function ChiamaEdicola(<System.Xml.Serialization.XmlElementAttribute([Namespace]:=[WSDL NAMESPACE])> ByVal ChiamaEdicolaRequest As ChiamaEdicolaRequest) As <System.Xml.Serialization.XmlElementAttribute("ChiamaEdicolaResponse", [Namespace]:=[WSDL NAMESPACE])> ChiamaEdicolaResponse
    Try
        Dim results() As Object = Me.Invoke("ChiamaEdicola", New Object() {ChiamaEdicolaRequest})
        Return CType(results(0), ChiamaEdicolaResponse)
    Catch ex As Exception
        MsgBox("Errore: " & vbCrLf & ex.Message)
        Return Nothing
    End Try
End Function

Наконец, фрагмент кода, где я вызываю эту функцию:

Private Sub SendRivData(ByVal IRWebSrvData As ChiamaEdicola)
Dim IRWebSrvSend As New ChiamaEdicolaRequest
Dim IRWebSrvRecv As ChiamaEdicolaResponse
Dim IRWebSrvClient As New EdicolaService
Dim TokenHeader As New IR2IG.TokenHeader

    IRWebSrvSend.ChiamaEdicola = IRWebSrvData

    TokenHeader.Token = "[TOKEN VALUE]"
    IRWebSrvClient.TokenHeader = TokenHeader

    IRWebSrvRecv = IRWebSrvClient.ChiamaEdicola(IRWebSrvSend)

    If IRWebSrvRecv Is Nothing Then 
        MsgBox("Errore durante l'elaborazione!", MsgBoxStyle.Exclamation)
        Exit Sub
    End If

    With IRWebSrvRecv
        If CInt(.Stato) <> 0 Then
            MsgBox("Elaborazione OK:" & vbCrLf & .Messaggio, MsgBoxStyle.Information)
        Else
            MsgBox("Errore durante l'elaborazione:" & vbCrLf & .Messaggio, MsgBoxStyle.Exclamation)
        End If
    End With
End Sub

Это все (мне пришлось пропустить несколько частей, потому что мой начальник не хотел, чтобы я их обнародовал).

Если кто-то знает, как этого добиться, пожалуйста, помогите мне. Это около 4 дней, я работаю над этим.

1 Ответ

0 голосов
/ 25 января 2012

Не связывайтесь с сгенерированным прокси-классом, а вместо этого расширяйте этот класс и предоставьте свою собственную реализацию, в вашем случае переопределите GetWriterForMessage и добавьте требуемый заголовок к сообщению, например. Следующий код просто чтобы дать вам представление о том, какчтобы соответствовать кусочкам:

Public Class ExtendedWebService
     Inherits myWebService

     Protected Overrides Function GetWriterForMessage(message As SoapClientMessage, bufferSize As Integer) As System.Xml.XmlWriter

         message.Headers.Add(YourCustomHeader)

         Return MyBase.GetWriterForMessage(message, bufferSize)
     End Function

End Class

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...