2012-04-15 100 views
2

我TREID使用的HttpContext在dataAceess层,但我不能创造从HttpContext的使用的HttpContext在数据访问层

HttpContext httpContext = HttpContext.Current; 

我创造一个Web应用程序和libery项目对象,我想使用的HttpContext在libery项目像这样:

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

+1

使从GetContextPerRequest()一个对象A的数据访问层应不** **可以根据一个面向UI组分上类似'HttpContext'。这样做只会强制将“数据访问层”绑定到ASP.NET Web应用程序 - 您无法将其用于例如WCF服务或WPF应用程序....我会认为这是一个非常非常糟糕的设计... – 2012-04-15 14:05:08

+0

最简单的解决方案是添加一个对System.Web的引用 – 2013-02-21 04:56:17

回答

0

我解决这样我的问题:

  1. 添加参考的System.Web
  2. 使用的System.Web;在我的数据访问层
  3. 在方法consractor
3

你可以从表现层解析HttpContext.Current和下面改变你的方法。如果你需要找到一种方法来访问当前http上下文this链接将帮助你。

public static Context GetContextPerRequest(HttpContext httpContext) 
    { 
     ------ 
     ------ 
    } 
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方法不属于数据访问层。

+0

只是阅读你的答案,并想知道我是否理解正确。是否有可能两个或多个线程可以在同一个HttpContext上进行异步工作并且上下文自动切换/同步(也可以将HttpContext.Current作为参数传递给新线程)?在这种情况下,您应该在设置HttpContext.Items []时实现锁定,以确保它不会在其他线程之一中发生? – MartinF 2012-07-12 00:53:11

+0

还是像Session.Items那里执行的线程得到一个独占的读/写锁(或一个副本),并没有其他线程可以使用它,直到线程完成? – MartinF 2012-07-12 01:38:31