2015-04-27 64 views
2

我爲HttpContext創建擴展方法。這種方法生成PDF文件。HttpContext在任務中變爲NULL

public static Task GeneratePdfTask(this HttpContext context, string path, int submissionId, string pdfName, Action<int, byte[]> postAction = null) 
    { 
     var local = context; 
     return Task.Factory.StartNew(() => 
     { 
      HttpContext.Current = local; 
      SessionHelper.Set(SessionKey.IsPdfRendering, true); 
      var pdfFile = new PdfGenerator().Generate(path, pdfName, submissionId); 
      if (postAction != null && pdfFile != null) 
      { 
       postAction(submissionId, pdfFile); 
      } 
     }); 
    } 

有時本會話(HttpContext.Current)變爲NULL,並且我得到異常。但不知道爲什麼。是否存在爲Session創建擴展的限制?也許還有一些解決方案如何安全地使用當前會話?

+0

爲什麼'Task.Factory.StartNew'而不是'Task.Run'?你在.NET 4.0或4.5中工作嗎? 4.5修復了在異步ASP.NET中配置HTTP上下文的幾個問題 –

+0

@PanagiotisKanavos,.NET 4.5.1 – demo

回答

1

不能同時使用來自多個線程的HTTP請求對象,所以這個問題是沒有意義的。將您想要跨線程顯式移動的數據傳遞給您。

解釋你所看到的:HttpContext.Current依賴於當前線程(實際上它是邏輯調用上下文)。不要將它設置爲某個值。你現在已經劫持了一些無辜的無關線程池線程的HttpContext.Current。您現在可能會發現不同的HTTP請求開始交互。這些是難以找到的難題。

+0

感謝您的回覆。好的,這似乎是解決方案(您的建議),但請告訴我,如果發送收集餅乾作爲參數是好的做法? – demo

+0

否,因爲該對象不是線程安全的。幾乎沒有任何ASP.NET對象。只有那些被文檔記錄爲線程安全的。在請求線程中提取必要的cookie信息並傳遞給它。 – usr