我有这段代码:
catch (Exception e)
{
try
{
transmitModel.AddAck(transmitBatchId,
"<error><message>" + e.Message + "</message><stack>" + e.StackTrace +
"</stack><Location>FromLisAtOMServer<Location>" +
"<TransmitBatchId>" + message.TransmitBatchId +
"</TransmitBatchId></error>", false, true);
}
// If we fail to log, we don't want that to bubble up...
// We want the real error to do that.
catch (Exception){}
// Re-throw the exception so that the service bus will
// move this off to the error queue.);
throw;
}
AddAck方法将该字符串保存到数据库(使用实体框架)。
当我在没有最后一个语句throw
的情况下运行它时,它会将我的错误消息保存到数据库中。
当我在那里有throw;
时,它表示它会保存但是当我查询数据库时它不在那里。我甚至可以在保存(在代码中)后立即通过我的数据上下文运行实体查询,并返回值,就好像它被保存一样(尽管可能使用缓存版本)。但如果我去查询后数据不存在......
我已经检查过以确保没有其他逻辑导致在异常时删除该值。
任何可能导致此问题的想法?
答案 0 :(得分:3)
好的,在这里作为答案发布,它很容易在我脑海中浮现,因为我曾经遇到过同样的问题,并且发现它只是因为我没有提交数据库事务。 谢谢,:))
答案 1 :(得分:0)
此调用是NServiceBus消息的结果。
我忘记了我的NServiceBus内容在分布式事务中运行。因此,当我抛出异常时,它会回滚所有挂起的更改。
我需要了解如何将此日志文件发布到事务外...
答案 2 :(得分:0)
NServiceBus可能为这种事情提供了钩子。
你的问题很可能就是你所说的:消息处理在事务中发生了。您无法提交,否则您也会提交错误。因此,您必须找出可以挂钩到邮件处理异常处理的位置。
使用Shuttle ESB(http://shuttle.codeplex.com/),我们使用管道来处理不同的用例,您可以挂钩由各种管道引发的PipelineException事件。 Shuttle能够让开发人员添加挂钩到各种事件中的模块。已经有SystemExceptionModule
或多或少做了你想要做的事情。