簡體   English   中英

c#HttpContext.Current.Items在生成線程中為null

[英]c# HttpContext.Current.Items is null in spawn thread

我有以下api方法:

public IHttpActionResult Post(LogModel value)
{
        try
        {
            IDictionary items = HttpContext.Current.Items;
            Thread thread = new Thread(() => LogSQL.LogDetail(items, value));
            thread.Start();

            return Ok();
        }
        catch (Exception ex)
        {
            ...
        }
    }

在擊中控制器之前,將調用身份驗證和授權代碼,該代碼將一些數據保存在HttpContext.Current.Items中。

對於新威脅,HttpContext.Current.Items為null,因此我從父線程傳遞了items數據以在子線程中設置一個。

public static void LogDetail(IDictionary items, LogModel log)
    {
        var keys = (from System.Collections.DictionaryEntry dict in items
                           let key = dict.Key.ToString()
                           select key).ToList();

        foreach (var key in keys)
        {
            HttpContext.Current.Items[key] = items[key];
        }

...}

但這是行不通的。 HttpContext.Current.Items為null且為只讀,因此我無法進行任何設置。

我可以將“ items” parm全部傳遞給新線程中需要數據的任何對象,但是要盡量避免。

關於如何解決這個問題的任何想法? 我可以使用任何線程技巧嗎?

HttpContext.Current綁定到處理HTTP請求的線程。 如果生成新線程,則該線程不會與該上下文關聯。

我可以將“ items” parm全部傳遞給新線程中需要數據的任何對象,但是要盡量避免。

那是正確的方法。 從當前上下文中提取所需的任何內容,並將其傳遞給線程。

請注意,在處理HTTP請求時生成線程有些危險,因為

  • 與請求不相關聯的線程中未處理的異常將導致進程中斷。
  • 如果在Web場中運行站點,則最終可能會遇到多個應用程序實例,所有這些實例都試圖同時運行同一任務。
  • 您的網站在其中運行的AppDomain可能由於多種原因而關閉,並因此而導致后台任務中斷。

參考資料 ,以及對該主題的很好的閱讀,包括更好的方法)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM