2010-04-07 60 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>