У меня много головной боли из-за проблемы, описанной в заголовке этой темы.
Я не очень хорошо разбираюсь в веб-сервисах, и я имею дело с одним, разработанным на 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 дней, я работаю над этим.