.net 如何访问用于在WCF服务(服务器端)上实现IDispatchMessageInspector的类中的属性?
我正在使用WCF IClientMessageInspector将标头中的信息发送到WCF服务(wsHTTP)。我正在使用IDispatchMessageInspector接收信息并填充字符串属性 当我在我的特定方法中使用FindHeader时,我验证了header是否正确地发送了信息,但我宁愿访问具有Token属性的自定义类并从中获取令牌,而不必在所有其他方法调用的单独方法中执行FindHeader以获取header值 所以我的问题是,从服务器端(我猜是OperationContext)如何访问这个使用头信息填充了Token属性的类实例 下面是整个类的代码: 区域“进口” 末端区域 区域“IEndpointBehavior” 末端区域 区域“IClientMessageInspector” 末端区域 区域“IDispatchMessageInspector” 末端区域.net 如何访问用于在WCF服务(服务器端)上实现IDispatchMessageInspector的类中的属性?,.net,wcf,idispatchmessageinspector,.net,Wcf,Idispatchmessageinspector,我正在使用WCF IClientMessageInspector将标头中的信息发送到WCF服务(wsHTTP)。我正在使用IDispatchMessageInspector接收信息并填充字符串属性 当我在我的特定方法中使用FindHeader时,我验证了header是否正确地发送了信息,但我宁愿访问具有Token属性的自定义类并从中获取令牌,而不必在所有其他方法调用的单独方法中执行FindHeader以获取header值 所以我的问题是,从服务器端(我猜是OperationContext)如何访
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;