Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 服务器端的HttpContext等价物?_C#_Asp.net_Linq_Linq To Entities_Httpcontext - Fatal编程技术网

C# 服务器端的HttpContext等价物?

C# 服务器端的HttpContext等价物?,c#,asp.net,linq,linq-to-entities,httpcontext,C#,Asp.net,Linq,Linq To Entities,Httpcontext,我有一个web应用程序,当前使用当前HttpContext存储LINQ数据上下文。当前请求的上下文将按每个用户、按: 但是,我有一些从global.asax文件执行的脚本,没有HttpContextHttpContext.Current为空,因为发出“请求”的是服务器 是否有一个等价的对象可以用来存储数据上下文?所以我不必担心重新创建它,以及附加/分离对象?我只想在进程的生命周期中保持上下文 更新: 我目前正试图在我的DAL助手类中使用一个静态变量。在第一次调用类中的一个方法时,DataCont

我有一个web应用程序,当前使用当前HttpContext存储LINQ数据上下文。当前请求的上下文将按每个用户、按:

但是,我有一些从global.asax文件执行的脚本,没有HttpContextHttpContext.Current为空,因为发出“请求”的是服务器

是否有一个等价的对象可以用来存储数据上下文?所以我不必担心重新创建它,以及附加/分离对象?我只想在进程的生命周期中保持上下文

更新:


我目前正试图在我的DAL助手类中使用一个静态变量。在第一次调用类中的一个方法时,DataContext被实例化,并存储在静态变量中。在我的过程结束时,我调用了另一个方法,该方法调用DataContext上的Dispose,并将静态变量设置为NULL。

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

(我刚刚检查过,虽然一个
HttpApplication
实例可以用于服务多个请求,但每个实例一次只服务一个请求-这表明创建了多个实例用于并发请求处理。我还没有对此进行验证,但将其保存在一个实例变量中听起来并不安全(不可靠)


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

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

我不理解基于hashcode或线程生成密钥的必要性。对于传入的每个请求,都将有一个单独的HttpContext实例,该实例特定于处理请求的线程。因此,当密钥基于HttpContext实例和线程时,它几乎一文不值

另外,完成后如何处理DataContext?它实现IDisposable是有原因的,所以我建议不要使用这样的共享实例


更新


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

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

如果您没有在请求的上下文中执行,可以考虑使用Application.Cache,但我要提醒您不要打开DataContext。我不太熟悉LINQtoEntities,所以我可能错了,但通常缓存数据库相关项(如连接)是不好的

<>我也建议您考虑将GROULAL.AXAX和Windows服务中的逻辑移出。这将使您对这些任务有更多的控制,例如,您可以单独关闭网站

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

是否有理由需要以与其他数据上下文相同的方式处理这些副本?在我看来,如果上下文只需要在事件处理例程中使用,那么就不需要保留它。特别是如果它在Application_Start(根据您的评论)中,我不会在任何地方缓存它——只要在本地使用它并根据需要将其传递给其他方法。

在创建计时器时将DataContext设置为状态参数。根据您在评论中发布的信息,我认为您的DataContext与计时器的关系比其他任何东西都要密切


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

脚本运行在哪些事件中?我假设Session_开始和结束?我有一些计时器,它们被创建为定期运行。它们是在应用程序启动事件期间创建的。它们经常运行,检查数据库中的内容并发送一些电子邮件。请澄清-您有一些方法可以返回当前上下文(如果不存在,则创建新上下文)。您希望这个方法在HttpContext可用和不可用的情况下(在计时器回调中)都能工作。对吧?那就很难实现了。计时器在不带HttpContext的单独线程中执行。因此,您不能存储在上下文项中。每个上下文可以跨越多个线程-您不能将引用存储在线程局部变量中。@SkippyFire根据您关于使用计时器的评论,我添加了一个答案。我对他的HttpContext也有同样的想法,但因为他正在生成线程,所以不会有上下文。@Josh:没有我
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
}