当我得到的只是消息时,如何知道我是否有BufferedMessage或BodyWriterMessage?

时间:2015-08-03 18:28:00

标签: c# wcf

我已经实现了IClientMessageInspectorIDispatchMessageInspector一些自定义日志记录类型的功能。在使这一切更加可插拔的过程中#34;我的每个实现现在调用一些具有CanProcess(object)方法的其他代码。 (有很多不同的插件,所以我需要找到一个可以处理Message对象的插件。)

由于MyClientMessageInspector.BeforeSendRequestMyDispatchMessageInspector.AfterReceiveRequest实现由于它们实现的接口而使用System.ServiceModel.Channels.Message类,因此需要可靠的方式来了解"其中"我有的消息 - 客户端上的消息,还是来自服务器的消息?遗憾的是,基础类BufferedMessageBodyWriterMessage都标记为内部类,因此我无法使用它们。

我已经进行了字符串比较黑客我讨厌但是有效

这是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的其他属性是否可以区分它们?

我完全讨厌这个字符串比较黑客。

1 个答案:

答案 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放在单独的库中并从那里读取值。