2012-01-25 11 views
0

このトピックのタイトルで説明されている問題で頭がいっぱいです。 私はウェブサービスにあまり良くないですし、私は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日です。

答えて

0

生成されたプロキシクラスで台無しにしないが、代わりに、このクラスを拡張し、あなたのケースオーバーライド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 

希望します!

+0

カスタムクラスを使用しないでcutomヘッダを追加することはできますか?私のカスタムヘッダーでGetWriterForMessageを変更しようとすると状況が変わらないので、 – Simone

+0

私はカスタムSoapHeaderクラスに少し変更を加えました。トークン公開文字列にを追加すると、GetWriterForMessageがそれを作った!ありがとう! – Simone

関連する問題