このトピックのタイトルで説明されている問題で頭がいっぱいです。 私はウェブサービスにあまり良くないですし、私はJavaで内部的に開発されたものを扱っています。 このWebサービスでは、トークンという名前のHeader要素に値(暗号化された文字列)が必要です。 私はこの "トークン"を追加することができましたが、サービスはそれを受け入れません。VB.NETとJava Webサービス - ヘッダー要素を追加しても期待された結果が得られません
これは私のプロキシが生成呼び出す(プロキシクラスWSDL.EXEで構築されたと私は要求するためにヘッダを追加するために書いたSoapHeaderは、外部クラスを受け入れるように変更された)要求xmlです:
<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>
、これは何ですか望んでいるWebサービス(これはクライアントtyestのJavaで作られたXML要求である):
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
:
<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>
これは私が書いたコードがあります10
、これは私がトークン
<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日です。
カスタムクラスを使用しないでcutomヘッダを追加することはできますか?私のカスタムヘッダーでGetWriterForMessageを変更しようとすると状況が変わらないので、 – Simone
私はカスタムSoapHeaderクラスに少し変更を加えました。トークン公開文字列にを追加すると、GetWriterForMessageがそれを作った!ありがとう! –
Simone