从WCF / MSMQ事务中排除一段代码?

时间:2012-01-21 16:49:07

标签: c# .net wcf msmq

我为解决方案构建了一个中央日志系统,该解决方案涉及使用WCF在多个专用队列(MSMQ)上路由和处理消息。在WCF服务的合同方法中,我做了一些日志记录。这里有一些简短的代码来说明:

[OperationBehavior(TransactionScopeRequired = true, TransactionAutoComplete = true)]
public void ReceiveMessage(MsmqMessage<MyMessageContainer> msg)
{
    try{
        Logger.Log(LogLevel.DEBUG, "Message Processing...");
        // process the message here
        Logger.Log(LogLevel.DEBUG, "Message Processed.");
    }
    catch(Exception exp) {
        Logger.LogError(exp);
        throw exp;
    }
}

这一切都不是惊天动地。 Logger本身写入事务队列,因此当抛出异常时,不仅将入站消息放回队列,记录器消息也不会被放入队列中。因此,无论外部事务中发生了什么,所有Logger消息都会被写入,我在Logger.Log方法中完成了以下操作(再次,简化):

public void Log(LogLevel level, string message)
{
    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress))
    {
        // write message to log queue
    }
}

这一切似乎都有效。我知道有些人会遵循“如果它有效,那是对的”理念,但我想知道这个解决方案是否有任何重大缺陷,或者我能做些什么更好?注意:我正在将代码部署到MSMQ 3和4,并构建在Framework v4.x上。

0 个答案:

没有答案