我在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。
答案 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)
我以这种方式解决了我的问题: