这是我的问题。我正在研究部署到多个欧洲国家的电子商务解决方案。我们将应用程序中的所有异常都保留到SQL Server中,并且我发现DB中的记录将来会有DateTime!
我们在web.config中定义文化,例如pt-PT,期望的格式是DD-MM-YYYY。
调试后我发现数据库中这些“未来”记录的问题是因为我们使用的回调方法。例如,在我们的缓存架构中,我们使用Callbacks,因此 -
CacheItemRemovedCallback ReloadCallBack = new CacheItemRemovedCallback(OnRefreshRequest);
当我检查当前线程CultureInfo时,在这些回调上它是en-US而不是pt-PT,并且HttpContext为null。如果回调发生异常,我们的异常管理器会将其报告为MM-DD-YYYY,因此它会错误地持久存储到SQL Server。
不幸的是,在异常管理器代码中,我们使用DateTime.Now,如果它不是回调就没问题。我无法将此代码更改为特定于文化,因为它在其他垂直行业中共享。
那么,为什么不回调到ASP.Net维护上下文?有没有办法在这个回调线程上维护它?这里的最佳做法是什么?
感谢。
答案 0 :(得分:0)
DateTime.Now不依赖于文化。你把它保存为字符串吗? ToString 取决于文化。
事实上,作为一般规则,尝试以不依赖于文化的方式将事物存储在数据库中。这在Web应用程序中尤为重要,因为每个请求的文化可能与下一个请求不同。为了能够“比较苹果与苹果”,你需要忽略文化。
答案 1 :(得分:0)
您应该将日期时间(推荐的UTC)与日志记录管理中的其余错误描述分开,并且还存储与日志条目关联的区域性。然后你可以独立地用这3个部分重新组装信息。
缓存回调来自一个线程池线程,在你的情况下总是有en-US而且没有HttpContext。您应该能够通过将已删除的缓存项与回调逻辑相关联来检索区域性文档。