2014-03-07 66 views
0

我工作的MVC應用程序。我創建了一個類來讀取媒體目錄。我需要用戶HttpContext在這個類,但我總是得到HttpContext.Current.UserHttpContext.Current.Servernull。下面是代碼訪問的HttpContext在C#類

public static async Task<string> GetImagesPath() 
{ 
    return await Task.Factory.StartNew<string>(() => 
    { 
     var CustomerNumber = HttpContext.Current.User.Identity.GetCustomerNumber().Result; 
     if (!string.IsNullOrEmpty(CustomerNumber)) 
     { 
      return HttpContext.Current.Server.MapPath(string.Format("~/Media/{0}/UserImages/", CustomerNumber)); 
     } 
     return string.Empty; 
    }); 
} 

如果做同樣的,這將是一個很大的幫助的任何更好的辦法。

+0

你可以通過上下文'GetImagesPath()'從網頁,將調用此方法 – yogi

+0

在控制器試試這個:System.Web.HttpContext.Current – DmitryK

+0

我認爲這僅僅是在主線程上可用。所以你需要將它作爲objectState參數傳遞。 – Silvermind

回答

1

目前HttpContext取決於當前線程上;由於您的代碼正在另一個線程中運行,因此無法訪問當前的HttpContext。只需保存上下文到一個局部變量在運行任務之前,並使用該變量的任務:

public static async Task<string> GetImagesPath() 
{ 
    var context = HttpContext.Current; 
    return await Task.Factory.StartNew<string>(() => 
    { 
     var CustomerNumber = context.User.Identity.GetCustomerNumber().Result; 
     if (!string.IsNullOrEmpty(CustomerNumber)) 
     { 
      return context.Server.MapPath(string.Format("~/Media/{0}/UserImages/", CustomerNumber)); 
     } 
     return string.Empty; 
    }); 
} 
+0

得到相同的輸出'null' – RaviMittal

+0

@thomas我想這個問題是'GetImagesPath'不是從Page類的不同類派生的類。 – yogi

+0

是'公共類MediaDirectories'它是一個簡單的C#類 – RaviMittal

3

HttpContext僅提供給請求的線程。不要將它傳遞給另一個線程; HttpContext不是線程安全的。

相反,刪除調用Task.Factory.StartNew。在ASP.NET上,幾乎沒有任何理由調用Task.Run或任何其他方法在線程池線程上執行代碼。

public static string GetImagesPath() 
{ 
    var CustomerNumber = HttpContext.Current.User.Identity.GetCustomerNumber().Result; 
    if (!string.IsNullOrEmpty(CustomerNumber)) 
    { 
     return HttpContext.Current.Server.MapPath(string.Format("~/Media/{0}/UserImages/", CustomerNumber)); 
    } 
    return string.Empty; 
} 
+0

調用哪個班就那麼什麼是沖洗反應的最好方法,而不是等待操作完成? –

+0

@BhushanFrake:我不知道。 –