我有当前使用当前HttpContext为存储LINQ数据上下文一个web应用程序。上下文是坚持当前请求,对每个用户的基础上,每里克施特拉尔的博客

string ocKey = "ocm_" + HttpContext.Current.GetHashCode().ToString("x")  
Thread.CurrentContext.ContextID.ToString();

if (!HttpContext.Current.Items.Contains(ocKey))
{
    // Get new Data Context and store it in the HTTP Context
}

不过,我有一些脚本,从Global.asax文件执行,即没有的HttpContext的。的的HttpContext.Current为NULL 下,因为服务器是一个使得 “请求”。

是否有我可以使用来存储数据上下文等同对象?所以我不担心重新创建它,并安装/拆卸对象?我只想坚持我的流程的生命周期的环境。

<强>更新:

我目前想在我DAL辅助类使用静态变量。在第一呼叫的在类DataContext的被实例化,并存储在静态变量的方法之一。在我的过程结束时,我调用上在DataContext调用Dispose,并且将静态变量为NULL的另一种方法。

有帮助吗?

解决方案

你能不能只用一个静态变量,专门为这些脚本?这将有什么样的生活,时间为AppDomain。你或许应该仔细考虑任何并发的担忧,但它听起来像是要保持周围值的最简单方法。

(我刚检查,虽然HttpApplication的一个实例可用于服务多个请求,每个仅提供一次一个请求 - 这表明多个实例并发请求处理创建的我没有验证这一点,但它听起来像它不会是安全的,以保持它的一个实例变量。)

编辑:乔什的回答表明,你想这是每个线程。这听起来有点奇怪对我来说,因为除非你有一个的很多的发生的这些事件,你很可能会永远只看到他们执行不同的线程,使得整个共享业务没有意义的。如果你真的想那种事情,我建议只是在HttpApplication派生类使用一个实例变量 - 在上面的段落描述的完全理由:)

其他提示

为什么不使用当前HttpContext?在Global.asax文件的脚本是进入服务器的请求的所有结果,所以应该有这一要求,你可以抓住相关的情境。

我不理解为基于所述散列码或线程中的键的需要。那里将是HttpContext的的一个单独的实例为附带在每个请求,该实例将是特定于对请求的处理的线程。正因为如此,关键是当它是基于HttpContext的实例和线程几乎一文不值。

此外,你怎么处置的DataContext的当你做了什么?它实现IDisposable的一个原因,所以我会建议对这样的共享实例


<强>更新

在的评论,它指示存在正在运行正在执行的脚本的定时器。取而代之的是定时器的,我建议设置一个预定的任务,它将调用将执行任务的网站上的Web服务或预定页面。然后,你将永远有一个HttpContext的一起工作。

HttpContext.Current是一个静态方法和该代码是一个请求的上下文中执行的应可从任何地方,只要

在你的情况你不是一个请求的上下文中执行,你可以看看使用Application.Cache但我奉劝不要拿着一个DataContext开放。我不是很famillar使用LINQ到实体,所以我可能是错的,但一般缓存数据库相关的项目,如连接不好。

我也建议您考虑移动逻辑移出的global.asax的和Windows服务。这将让你有过这些任务更多的控制权,比如你可以将其关闭网站的seperatley。

修改

由于JS所指出的,你可以使用一个静态变量。你也可以定义标记的ThreadLocal属性的实例变量。这将会给每个线程它自己的变量副本,并可消除竞争。既然你希望每个线程反正有它自己的拷贝。

有没有为什么这些需要被以同样的方式处理与其他DataContexts理由吗?在我看来,如果只需要在事件处理程序内的情况下,你不应该需要保持它周围。尤其是如果它是在的Application_Start(根据您的评论),我不会理会任何地方缓存它 - 只是用它在本地,并根据需要将它传递给其他方法

创建计时器时设置的DataContext作为状态参数。根据您发布的评论信息,在我看来,你的DataContext更关系到计时器比什么都重要。

也避免使用相同的DataContext为不同的定时器,因为你将与从不同的定时器混合修改结束。还确保您相同的定时器逻辑不运行两次,因为它会导致与没有控制相同即太短周期。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top