.net 如何访问用于在WCF服务(服务器端)上实现IDispatchMessageInspector的类中的属性?

.net 如何访问用于在WCF服务(服务器端)上实现IDispatchMessageInspector的类中的属性?,.net,wcf,idispatchmessageinspector,.net,Wcf,Idispatchmessageinspector,我正在使用WCF IClientMessageInspector将标头中的信息发送到WCF服务(wsHTTP)。我正在使用IDispatchMessageInspector接收信息并填充字符串属性 当我在我的特定方法中使用FindHeader时,我验证了header是否正确地发送了信息,但我宁愿访问具有Token属性的自定义类并从中获取令牌,而不必在所有其他方法调用的单独方法中执行FindHeader以获取header值 所以我的问题是,从服务器端(我猜是OperationContext)如何访

我正在使用WCF IClientMessageInspector将标头中的信息发送到WCF服务(wsHTTP)。我正在使用IDispatchMessageInspector接收信息并填充字符串属性

当我在我的特定方法中使用FindHeader时,我验证了header是否正确地发送了信息,但我宁愿访问具有Token属性的自定义类并从中获取令牌,而不必在所有其他方法调用的单独方法中执行FindHeader以获取header值

所以我的问题是,从服务器端(我猜是OperationContext)如何访问这个使用头信息填充了Token属性的类实例

下面是整个类的代码:

区域“进口” 末端区域 区域“IEndpointBehavior” 末端区域 区域“IClientMessageInspector” 末端区域 区域“IDispatchMessageInspector” 末端区域
End Class

根据我看到的WCF团队正在建立的模式,我的建议是让IDispatchMessageInspector将标题的值放入当前OperationContext的字典中。通过这样做,该值将绑定到当前操作上下文,并由WCF运行时为您正确地执行所有阶段

至于如何进一步读取堆栈中的值,您可以做两件事。首先,您可以将用于将值读/写到静态只读字符串上的properties集合的string键公开给其他代码可以使用它从OperationContext检索值的地方。如下所示:

int value = (int)OperationContext.Current.IncomingMessageProperties[MyMessageProperty.MyHeader];
现在,这仍然需要所有需要读取值的人进行大量编码。获取当前上下文,使用键索引到字典中,并将结果转换为正确的类型(我在上面使用int作为示例)。如果你想变得更有趣,你可以采取的下一步是通过你自己的上下文类公开这些属性,这样人们就可以像普通的强类型CLR属性一样访问它们。可能看起来有点像这样:

首先,在名为MyOperationContext的类上实现静态访问器属性:

public static int MyHeader
{
    get
    {
        return (int)OperationContext.Current.IncomingMessageProperties[MyMessageProperty.MyMessageProperty];
    }

    set
    {
        OperationContext.Current.IncomingMessageProperties[MyMessageProperty.MyMessageProperty] = value;
    }
}
现在,在需要读取此标题的各种实现中,它们只需执行以下操作:

int value = MyOperationContext.MyHeader;

哇,老答案刚刚出来。作为记录,我现在将完全将其实现为OperationContext类的扩展方法,而不是静态类/属性。:)
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
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
int value = (int)OperationContext.Current.IncomingMessageProperties[MyMessageProperty.MyHeader];
public static int MyHeader
{
    get
    {
        return (int)OperationContext.Current.IncomingMessageProperties[MyMessageProperty.MyMessageProperty];
    }

    set
    {
        OperationContext.Current.IncomingMessageProperties[MyMessageProperty.MyMessageProperty] = value;
    }
}
int value = MyOperationContext.MyHeader;