2012-04-15 98 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