2

我想在 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。

4

3 回答 3

3

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

   public static Context GetContextPerRequest(HttpContext httpContext)
   {
      ------
      ------
   }
于 2012-04-15T13:08:22.563 回答
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方法不属于数据访问层。

于 2012-04-15T13:09:13.250 回答
-1

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

  1. 添加对 system.web 的引用
  2. 使用 system.web;在我的数据访问层
  3. 在方法承包商中从 GetContextPerRequest() 创建一个对象
于 2012-04-16T18:47:00.823 回答