MSMQ,WCF和Enterprise Library 5记录应用程序块

时间:2011-05-12 10:17:54

标签: wcf enterprise-library msmq

背景:我正在使用WCF和MSMQ在服务器上执行长时间运行的作业。一般错误记录由Enterprise Library 5 Logging Application Block完成。

我的问题是: 一旦ExecutingMethod()从队列中取出并开始执行,私有LogWriter _writer = EnterpriseLibraryContainer.Current.GetInstance()始终为null,导致不记录可能的错误。

 public class SerializedClass
 {
     private LogWriter _writer = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();

     public void ExecutingMethod()
     {
         try
         {
             .....
         }
         catch(Exception ex)
         {
             _writer.Write(ex, Category.General, Priority.Highest);
         }
     }
 }

我已经检查过执行程序集可以看到日志记录配置。我的假设是'SerializedClass'的序列化可能存在问题?

任何帮助或意见都会受到赞赏吗?

1 个答案:

答案 0 :(得分:2)

LogWriter类显然不可序列化。您从代码中执行的序列化并不明显。实际上,从你的序列化代码来看并不明显,所以我猜这里。

无论如何,我不确定你使用的是什么序列化器,但不管它是什么,LogWriter都不会干净利落地完成它。 .NET序列化程序通常不会重新运行类型的构造函数,因此对于不干净地反序列化的字段,您可能会像您一样得到null。

解决方法很简单 - 在实际需要之前不要抓取LogWriter。抓住它,而不是将它存储在构造函数中。在这种情况下,使用旧的静态外观可能更容易,只需调用Logger.Write()而不是通过特定的LogWriter实例。

-Chris