在数据访问层中使用Httpcontext

时间:2012-04-15 12:50:33

标签: asp.net entity-framework c#-4.0 entity-framework-4.1

我在dataAceess层中使用HttpContext但我无法从HttpContext创建一个对象

 HttpContext httpContext = HttpContext.Current;

我创建了一个Web应用程序和一个libery项目,我想在libery项目中使用HttpContext,如下所示:

public static Context GetContextPerRequest()
   {

       HttpContext httpContext = HttpContext.Current;
       if (httpContext == null)
       {
           return new Context();
       }
       else
       {
           int contextId = Thread.CurrentContext.ContextID;
           int hashCode = httpContext.GetHashCode();
           string key = string.Concat(hashCode, contextId);

           Context context = httpContext.Items[key] as Context;
           if (context == null)
           {
               context = new Context();
               httpContext.Items[key] = context;
           }

           return context;
       }
   }

我使用.net 4。

3 个答案:

答案 0 :(得分:3)

您可以从表示层解析HttpContext.Current并更改您的方法,如下所示。如果您需要找到一种方法来访问当前的http上下文this链接将帮助您。

   public static Context GetContextPerRequest(HttpContext httpContext)
   {
      ------
      ------
   }

答案 1 :(得分:1)

我不确定你的问题是什么,但你的代码显示了一些非常糟糕的概念。

您期望这会做什么?

int contextId = Thread.CurrentContext.ContextID;
int hashCode = httpContext.GetHashCode();
string key = string.Concat(hashCode, contextId);

Context context = httpContext.Items[key] as Context;
if (context == null)
{
    context = new Context();
    httpContext.Items[key] = context;
}

HttpContext是ASP.NET中HTTP请求处理的安全存储。 HttpContext.Current为每个请求返回唯一的实例,并且此实例独立于处理请求的线程 - 即使在异步处理中,HttpContext将随您的请求从线程流向线程,但您将永远不会有两个线程正在处理相同的请求(除非您尝试生成自己的线程)。如果您尝试生成自己的线程,则根本不能使用这种方式,因为HttpContext实例仅在处理请求之前存在,但您的自定义线程生存期可能更长。

所以你使用的代码只是过于复杂的版本:

Context context = httpContext.Items["Context"] as Context;
if (context == null)
{
    context = new Context();
    httpContext.Items["Context"] = context;
}

此外,如果此代码来自您的数据访问层,则设置错误。数据访问层处理数据访问,应独立于上层处理 - 包括HTTP请求处理。这意味着您的GetContextPerRequest方法不属于数据访问层。

答案 2 :(得分:-1)

我以这种方式解决了我的问题:

  1. 添加对system.web的引用
  2. 使用system.web;在我的数据访问层
  3. 在Method consractor
  4. 中从GetContextPerRequest()创建一个对象