MSMQ、WCF和企业库5日志记录应用程序块

MSMQ、WCF和企业库5日志记录应用程序块,wcf,enterprise-library,msmq,Wcf,Enterprise Library,Msmq,背景:我使用WCF和MSMQ在服务器上执行长时间运行的作业。一般错误日志记录由Enterprise Library 5日志记录应用程序块完成 我的问题是: private LogWriter _writer=EnterpriseLibraryContainer.Current.GetInstance()在从队列中提取ExecutionMethod()并开始执行后始终为null,从而导致无法记录可能的错误 public class SerializedClass { private

背景:我使用WCF和MSMQ在服务器上执行长时间运行的作业。一般错误日志记录由Enterprise Library 5日志记录应用程序块完成

我的问题是: private LogWriter _writer=EnterpriseLibraryContainer.Current.GetInstance()在从队列中提取ExecutionMethod()并开始执行后始终为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
{
私有日志编写器_writer=EnterpriseLibraryContainer.Current.GetInstance();
public void ExecutingMethod()
{
尝试
{
.....
}
捕获(例外情况除外)
{
_writer.Write(例如,Category.General,Priority.Highest);
}
}
}
我已经检查了日志配置是否对正在执行的程序集可见。我的假设是“SerializedClass”的序列化可能有问题


任何帮助或输入都将不胜感激。

LogWriter类是显式不可序列化的。从代码看,您正在做的序列化并不明显。实际上,从您序列化的代码中根本看不出这一点,所以我在这里猜测

不管怎样,我不确定您使用的是什么序列化程序,但不管它是什么,LogWriter都不会彻底检查它。NET序列化程序通常不会重新运行类型的构造函数,因此对于未进行干净反序列化的字段,可能会像现在这样得到null

解决方法很简单——在您真正需要日志编写器之前,不要抓住它。在catch块中获取它,而不是将其存储在构造函数中。在这种情况下,使用较旧的静态facades可能会更容易,只需调用Logger.Write(),而不必经过特定的LogWriter实例

-克里斯