我已经实现了IClientMessageInspector
和IDispatchMessageInspector
一些自定义日志记录类型的功能。在使这一切更加可插拔的过程中#34;我的每个实现现在调用一些具有CanProcess(object)
方法的其他代码。 (有很多不同的插件,所以我需要找到一个可以处理Message
对象的插件。)
由于MyClientMessageInspector.BeforeSendRequest
和MyDispatchMessageInspector.AfterReceiveRequest
实现由于它们实现的接口而使用System.ServiceModel.Channels.Message
类,因此需要可靠的方式来了解"其中"我有的消息 - 客户端上的消息,还是来自服务器的消息?遗憾的是,基础类BufferedMessage
和BodyWriterMessage
都标记为内部类,因此我无法使用它们。
我已经进行了字符串比较黑客我讨厌但是有效
这是DispatchMessageInspector调用的CanProcess
方法:
public bool CanProcess(object testObject)
{
return (testObject != null)
&& (testObject is System.ServiceModel.Channels.Message)
&& (testObject.GetType().UnderlyingSystemType
.FullName == "System.ServiceModel.Channels.BufferedMessage");
}
,这与ClientMessageInspector调用的相同:
public bool CanProcess(object testObject)
{
return (testObject != null)
&& (testObject is System.ServiceModel.Channels.Message)
&& (testObject.GetType().UnderlyingSystemType
.FullName == "System.ServiceModel.Channels.BodyWriterMessage");
}
有什么想法? Message.Properties
中有哪些内容我忽略了,或Message
的其他属性是否可以区分它们?
我完全讨厌这个字符串比较黑客。
答案 0 :(得分:0)
您可以使用MessageHeaders进行自定义识别。
以下是我填充标题的自定义WCF邮件检查器示例:
public class WCFMessageInspector : IClientMessageInspector
{
public void AfterReceiveReply(ref Message reply, object correlationState)
{
}
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
//in this sample I use predefined Guid to distinct specific client...
Guid clientId = new Guid("5DBD6E89-81F2-4786-BC93-2758A8368A5D");
MessageHeader<Guid> header = new MessageHeader<Guid>((Guid)clientId);
MessageHeader untyped = header.GetUntypedHeader("Identity", "http://www.MyCustomNamespace.com");
request.Headers.Add(untyped);
return null;
}
}
在接收结束时,您可以像这样阅读此邮件标题:
MessageHeaders headers = OperationContext.Current.IncomingMessageHeaders;
try
{
Guid clientId = headers.GetHeader<Guid>("Identity", "http://www.MyCustomNamespace.com");
if (clientId == new Guid("5DBD6E89-81F2-4786-BC93-2758A8368A5D")
{
//TODO: this is our target client, do your stuff here...
}
}
catch (Exception)
{
}
最佳做法是将关键字符串/ Guid放在单独的库中并从那里读取值。