服务器端相当于HttpContext?

时间:2009-03-31 19:28:45

标签: c# asp.net linq linq-to-entities httpcontext

我有一个Web应用程序,当前使用当前的HttpContext来存储LINQ数据上下文。根据每个用户,每个Rick Strahl's blog

为当前请求保留上下文
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。

5 个答案:

答案 0 :(得分:4)

你能不能只为这些脚本使用静态变量?这将与AppDomain具有相同的生命周期。您应该仔细考虑任何并发问题,但这听起来像是保持价值的最简单方法。

(我刚刚检查过,虽然HttpApplication的一个实例可用于为多个请求提供服务,但每个请求一次只能处理一个请求 - 这表明为并发请求处理创建了多个实例。我没有验证这一点,但听起来确实将它保存在实例变量中并不安全。)

编辑:Josh的回答表明你希望这是每个线程。这对我来说听起来有点奇怪,因为除非你发现了这些事件的很多,否则你很可能只会看到它们在不同的线程上执行,这使得整个共享业务毫无意义。如果你真的想要这样的东西,我建议只在HttpApplication - 派生类中使用一个实例变量 - 完全是上面段落中描述的原因:)

答案 1 :(得分:1)

为什么不使用当前的HttpContext? global.asax文件中的脚本都是请求进入服务器的结果,因此应该有一个与您可以获取的请求相关联的上下文。

我不明白需要根据哈希码或线程生成密钥。对于每个进入的请求,都会有一个单独的HttpContext实例,该实例将特定于处理请求的线程。因此,当它基于HttpContext和线程的实例时,密钥几乎毫无价值。

另外,完成后如何处理DataContext?它出于某种原因实现了IDisposable,因此我建议不要使用这样的共享实例。


<强>更新

在注释中,它表示正在运行正在执行脚本的计时器。我建议设置一个计划任务,而不是计时器,它将调用网站上的Web服务或预定页面来执行任务。然后你将总是有一个HttpContext来使用。

答案 2 :(得分:0)

HttpContext.Current是一个静态方法,只要代码在请求的上下文中执行,就应该可以在任何地方使用。

在您的情况下,您没有在请求的上下文中执行,您可以查看使用Application.Cache但我会提醒您不要打开DataContext。我对linq到实体并不是很熟悉,所以我可能是错的,但通常缓存数据库相关的项目,如连接是不好的。

我还建议您考虑将逻辑移出global.asax并转移到Windows服务。这样您就可以更好地控制这些任务,例如,您可以将它们关闭到网站的单独位置。

修改

JS指出你可以使用静态变量。您还可以定义标记为ThreadLocal属性的实例变量。这将为每个线程提供自己的变量副本,并可以消除争用。因为你希望每个线程都有自己的副本。

答案 3 :(得分:0)

为什么这些需要以与其他DataContexts相同的方式处理?在我看来,如果仅在事件处理例程中需要上下文,则不需要保留它。特别是如果它在Application_Start中(根据你的评论),我不打算在任何地方缓存它 - 只需在本地使用它并根据需要将其传递给其他方法。

答案 4 :(得分:0)

创建计时器时将DataContext设置为状态参数。根据您在评论中发布的信息,在我看来,您的DataContext与计时器的关系比其他任何事情都要多。

同时避免对不同的计时器使用相同的DataContext,因为最终会得到来自不同计时器的混合修改。还要确保你的同一个计时器逻辑没有运行两次,因为它会导致相同的,即没有控制的时间太短。