WCF IClientMessageInspector を使用して、ヘッダー内の情報を WCF サービス (wsHTTP) に送信しています。IDispatchMessageInspector を使用して情報を受け取り、String プロパティを設定しています。
特定のメソッド内で FindHeader を使用しているため、ヘッダーが情報を適切に送信していることを確認しましたが、別のメソッドで FindHeader を実行するのではなく、Token プロパティを持つカスタム クラスにアクセスし、そこからトークンを取得したいだけです。他のすべてのメソッドは、ヘッダー値を取得するために呼び出します。
私の質問は、サーバー側 (OperationContext だと思います) から、ヘッダー情報が入力された Token プロパティを持つこのクラス インスタンスにアクセスするにはどうすればよいですか?
以下は、クラス全体のコードです。
地域「輸入」
Imports System.ServiceModel
Imports System.ServiceModel.Dispatcher
Imports System.ServiceModel.Description
Imports System.ServiceModel.Channels
Imports System.ServiceModel.Configuration
エンドリージョン
Public Class MessageInspector
Inherits BehaviorExtensionElement
Implements IClientMessageInspector, IDispatchMessageInspector, IEndpointBehavior
Private Const headerName As String = "HeaderToken"
Private Const headerNamespace As String = "urn:com.nc-software.services:v1"
Private _token As String
Public Property Token() As String
Get
Return _token
End Get
Set(ByVal Value As String)
_token = Value
End Set
End Property
Public Overrides ReadOnly Property BehaviorType() As System.Type
Get
Return GetType(MessageInspector)
End Get
End Property
Protected Overrides Function CreateBehavior() As Object
Return New MessageInspector
End Function
領域 " IEndpointBehavior "
Public Sub AddBindingParameters(ByVal endpoint As System.ServiceModel.Description.ServiceEndpoint, ByVal bindingParameters As System.ServiceModel.Channels.BindingParameterCollection) Implements System.ServiceModel.Description.IEndpointBehavior.AddBindingParameters
End Sub
Public Sub ApplyClientBehavior(ByVal endpoint As System.ServiceModel.Description.ServiceEndpoint, ByVal clientRuntime As System.ServiceModel.Dispatcher.ClientRuntime) Implements System.ServiceModel.Description.IEndpointBehavior.ApplyClientBehavior
clientRuntime.MessageInspectors.Add(Me)
End Sub
Public Sub ApplyDispatchBehavior(ByVal endpoint As System.ServiceModel.Description.ServiceEndpoint, ByVal endpointDispatcher As System.ServiceModel.Dispatcher.EndpointDispatcher) Implements System.ServiceModel.Description.IEndpointBehavior.ApplyDispatchBehavior
endpointDispatcher.DispatchRuntime.MessageInspectors.Add(Me)
End Sub
Public Sub Validate(ByVal endpoint As System.ServiceModel.Description.ServiceEndpoint) Implements System.ServiceModel.Description.IEndpointBehavior.Validate
End Sub
エンドリージョン
領域「 IClientMessageInspector 」
Public Sub AfterReceiveReply(ByRef reply As System.ServiceModel.Channels.Message, ByVal correlationState As Object) Implements System.ServiceModel.Dispatcher.IClientMessageInspector.AfterReceiveReply
End Sub
Public Function BeforeSendRequest(ByRef request As System.ServiceModel.Channels.Message, ByVal channel As System.ServiceModel.IClientChannel) As Object Implements System.ServiceModel.Dispatcher.IClientMessageInspector.BeforeSendRequest
Dim header As New MessageHeader(Of String)(Token)
Dim untypedHeader As MessageHeader = header.GetUntypedHeader(headerName, headerNamespace)
request.Headers.Add(untypedHeader)
Return Nothing
End Function
エンドリージョン
領域「 IDispatchMessageInspector 」
Public Function AfterReceiveRequest(ByRef request As System.ServiceModel.Channels.Message, ByVal channel As System.ServiceModel.IClientChannel, ByVal instanceContext As System.ServiceModel.InstanceContext) As Object Implements System.ServiceModel.Dispatcher.IDispatchMessageInspector.AfterReceiveRequest
Try
Dim headers As MessageHeaders = OperationContext.Current.IncomingMessageHeaders
Dim headerIndex As Integer = headers.FindHeader(headerName, headerNamespace)
If headerIndex >= 0 Then
Token = headers.GetHeader(Of String)(headerIndex)
End If
Catch
End Try
Return Nothing
End Function
Public Sub BeforeSendReply(ByRef reply As System.ServiceModel.Channels.Message, ByVal correlationState As Object) Implements System.ServiceModel.Dispatcher.IDispatchMessageInspector.BeforeSendReply
End Sub
エンドリージョン
クラス終了