MessageInspector中的标头未更新

时间:2016-11-10 12:53:57

标签: c# wcf

我试图在各种WCF服务中实现消息拦截器。我的目标是跟踪自客户端第一次呼叫以来在这些服务之间进行的每个呼叫。所以我试图在标题中附加一个计数器来知道调用了多少服务。在我的检查器类中,在AfterReceiveRequest方法中,我检查标头是否具有计数器的属性,如果有,我添加一个,如果不是,我将值设置为1.

在这种方法中我遇到了两个问题: 1.在第二次调用另一个服务时,当调用AfterReceiveRequest时,我的标题中的属性永远不存在,所以再次将其设置为一个。 2.在BeforeSendReply中,我尝试更新标题中的值,EndDate使用当前日期,但该值既未返回: - /

我不知道我是否将标题设置错误。第二次调用中的标题应该是相同的,对吗?

这是我的督察班

public class LogMessageInspector : IDispatchMessageInspector
{
    #region Implementacion de IDispatchMessageInspector

    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
    {            
        try
        {
            LoggerContext lc = new LoggerContext();
            var currentLoggerContext = TryGetHeader<LoggerContext>("LoggerContext", "http://tempuri.org");

            if (currentLoggerContext == null || currentLoggerContext == default(LoggerContext))
            {
                lc.TrackingNo = 1;
                lc.StartDate = DateTime.Now;
            }
            else
            {
                lc.StartDate = currentLoggerContext.StartDate;
                lc.TrackingNo = lc.TrackingNo + 1;

                OperationContext.Current.OutgoingMessageHeaders.RemoveAll("LoggerContext", "http://tempuri.org");
            }

            MessageHeader messageHeader = MessageHeader.CreateHeader("LoggerContext", "http://tempuri.org", lc);
            OperationContext.Current.OutgoingMessageHeaders.Add(messageHeader);

        } catch (Exception ex) {

        }

        return null;
    }

    public void BeforeSendReply(ref Message reply, object correlationState)
    {
        var currentLoggerContext = TryGetHeader<LoggerContext>("LoggerContext", "http://tempuri.org");
        if (currentLoggerContext != null)
        {
            LoggerContext lc = new LoggerContext();

            lc.EndDate = DateTime.Now;
            lc.TrackingNo = currentLoggerContext.TrackingNo;
            lc.StartDate = currentLoggerContext.StartDate;

            OperationContext.Current.OutgoingMessageHeaders.RemoveAll("LoggerContext", "http://tempuri.org");
            MessageHeader messageHeader = MessageHeader.CreateHeader("LoggerContext", "http://tempuri.org", lc);
            OperationContext.Current.OutgoingMessageHeaders.Add(messageHeader);
        }
    }

    #endregion

    private static T TryGetHeader<T>(string name, string sn)
    {
        try 
        {
            return OperationContext.Current.OutgoingMessageHeaders.GetHeader<T>(name, sn);
        }
        catch
        {
            return default(T);
        }
    }
}

LoggerContext是

public class LoggerContext 
{
    public int TrackingNo { get; set; }

    public DateTime StartDate { get; set; }

    public DateTime EndDate { get; set; } 
}

任何帮助将不胜感激:)

0 个答案:

没有答案