我正在构建将在公司内部使用的ASP.NET Web服务。异常和跟踪/审计日志记录将由Web服务类以及Web服务将调用的业务对象执行。日志记录由内部开发的日志助手类的实例处理。日志帮助程序必须是一个实例,因为它跟踪了状态和用于将日志消息关联到组中的引用guid。如何在asp.net web服务中存储对象以便业务对象可以引用该对象?
在过去,我们通过使用方法参数将对日志帮助器实例的引用传递给类来处理这种情况。我试图找到一种可靠的方法来找到一种方法来存储和访问整个调用实例,而不必明确地通过它。
我试图在Web服务调用的早期阶段将实例存储在HTTPContext中。当我的业务对象稍后在调用期间需要它时,它们将作为基类的一个属性来访问它,以便继承我所有的对象。
最初我尝试将实例存储在Web服务的Context.Cache中。这似乎工作,我的研究使我相信Cache将是线程安全的。直到我从超过3个并发会话开始调用Web服务时,记录器的实例才会从呼叫共享到呼叫,而不是为每个呼叫重新创建。我尝试了Context.Application,发现与Cache存储非常相似的结果。
我能够通过Context.Session找到可用的解决方案。这要求我在每个方法的属性中使用EnableSession = true,但它似乎确保每个调用都保持实例唯一。我不需要跟踪通话间的数据,所以我不会将会话cookie存储在客户端空间中。
会话是我需要的最佳存储点吗?这似乎有点沉重,因为我不需要跟踪通话之间的会话。我愿意接受建议或批评。我确定有人会建议使用内置的Trace记录或Elmah等系统。这些可能是未来的一个选择,但现在我没有时间走下去。
更新:我应该澄清,此服务将需要在.Net Framework 2.0上运行。我们正在转移到3.5/4.0,但我们目前的生产服务器是最高2.0的Win2000。
顺便说一句,术语“对象实例”是多余的。一个对象是一个类的实例。 – 2010-08-09 19:33:10
感谢您更新问题。 “一个对象的实例”是我成长起来的东西,但绝不会试图争辩正确。 – 2010-08-09 20:27:18