2010-04-07 59 views
1

我有一個方法試圖更新ASP.NET應用程序中的SQL Server數據庫。如果更新失敗,它會捕獲該異常,然後將MSMQ中的更新排隊,然後啓動一個新線程,稍後將暫掛的更新取消排隊並再次嘗試。線程啓動時,無法打開數據庫連接,因爲它試圖使用網絡服務作爲登錄進行連接。 sql連接使用Windows身份驗證,並且將在線程之外工作。如果我在新線程中執行的代碼中放置斷點並檢查Thread.CurrentPrincipal,它會將Identity顯示爲正確的用戶。爲什麼試圖通過網絡服務帳戶打開sql連接?C#線程和Sql連接

我可以進一步闡述是必要的。

謝謝。

+0

你是如何開始新的線程? – Cocowalla 2010-04-07 14:38:04

+0

Thread thread = new Thread(delegate); thread.Start(); – 2010-04-07 15:17:45

回答

1

我發現了一個更優雅的解決方案,它不需要修改aspnet.config文件。

// get the current WindowIdentity of the main thread 
var currentIdentity = WindowsIdentity.GetCurrent(); 

Thread thread; 
thread = new Thread(() => 
      { 
       // using lambda closure, access the current identity 
       // inside the background thread scope and call Impersonate 
       var context = currentIdentity.Impersonate(); 

       // do multi-threaded stuff 


       // undo the impersonation before leaving the thread 
       context.Undo(); 
      }) 
     { 
      Name = "BackgroundThread", 
      IsBackground = true 
     }; 
thread.Start(); 
0

我認爲你需要檢查網站運行在IIS下的應用程序池的身份 - 它是否設置爲網絡服務?

此外,什麼模擬設置是在你的web.config文件?檢查您是否正在模擬當前用戶,特定用戶或沒有用戶(因此正在使用應用程序池標識)。

如果您也發佈了連接字符串,這將非常有用。

+0

應用程序池正在使用默認的網絡服務標識。 在web.config中,標識具有impersonate =「true」,我們正在模擬特定帳戶。 連接字符串使用Trusted_Connection = yes; data source = myDataSource; 我發現這篇文章:http://support.microsoft.com/kb/326606這可能是相似的。我沒有使用會話狀態,但本文指出會話狀態使用後臺線程連接到sql server數據庫,因此無法連接,因爲線程在ASP.NET工作進程下運行。 – 2010-04-07 15:12:19

1

我想通了基於這個線程: http://bytes.com/topic/asp-net/answers/597465-simple-thread-issue

我不得不把它添加到線程的代碼塊的頂部:

((WindowsIdentity)Thread.CurrentPrincipal.Identity).Impersonate(); 
+0

實際上,這也不起作用,因爲我檢查了數據庫用來從主線程和後臺線程調用的憑據。事實證明,上述只是模仿我(登錄的用戶),而不是web.config中指定的服務帳戶。由於我可以訪問數據庫,所以調用成功了,但是當這個過程進行到生產時,情況就不會如此。 o現在我正在查看ExecutionContext並查看是否爲我購買了一些東西。 – 2010-04-07 19:03:56

0

這個環節,我找到了答案: http://www.leastprivilege.com/WhatIsAspnetconfig.aspx

這裏是信息的鍵位:

<configuration> 
    <runtime> 
    <legacyUnhandledExceptionPolicy enabled="false" /> 
    <SymbolReadingPolicy enabled="1" /> 

    <legacyImpersonationPolicy enabled="false" /> 
    <alwaysFlowImpersonationPolicy enabled="true" /> 
    </runtime> 
<configuration>