Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net C#线程和Sql连接_.net_Sql Server 2005_Multithreading_Security - Fatal编程技术网

.net C#线程和Sql连接

.net C#线程和Sql连接,.net,sql-server-2005,multithreading,security,.net,Sql Server 2005,Multithreading,Security,我有一个方法尝试在ASP.NET应用程序中更新sql server数据库。如果更新失败,它将捕获异常,然后在MSMQ中对更新进行排队,然后启动一个新线程,该线程稍后将取消挂起的更新的排队,然后重试。当线程启动时,它无法打开数据库连接,因为它正试图使用网络服务作为登录进行连接。sql连接正在使用Windows身份验证,并且将在线程之外工作。如果我在新线程内执行的代码中放置一个断点并检查thread.CurrentPrincipal,它将显示正确用户的身份。为什么sql连接试图由网络服务帐户打开 我

我有一个方法尝试在ASP.NET应用程序中更新sql server数据库。如果更新失败,它将捕获异常,然后在MSMQ中对更新进行排队,然后启动一个新线程,该线程稍后将取消挂起的更新的排队,然后重试。当线程启动时,它无法打开数据库连接,因为它正试图使用网络服务作为登录进行连接。sql连接正在使用Windows身份验证,并且将在线程之外工作。如果我在新线程内执行的代码中放置一个断点并检查thread.CurrentPrincipal,它将显示正确用户的身份。为什么sql连接试图由网络服务帐户打开

我可以进一步阐述,这是必要的


谢谢。

我认为您需要检查IIS中运行网站的应用程序池的标识-是否设置为网络服务

另外,web.config文件中有什么模拟设置?检查您是在模拟当前用户、特定用户还是没有用户(因此正在使用应用程序池标识)


如果你也发布了你的连接字符串,这将非常有用。

我是根据这个线程计算出来的:

我必须将此添加到线程代码块的顶部:

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

这个链接就是我找到答案的地方:

以下是关键信息:

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

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

我发现了一个更优雅的解决方案,它不需要修改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();

如何启动新线程?线程线程=新线程(委托);thread.Start();应用程序池正在使用默认的网络服务标识。在web.config中,标识为impersonate=“true”,我们正在模拟特定帐户。连接字符串正在使用Trusted_connection=yes;数据源=myDataSource;我发现这篇文章:可能是类似的。我没有使用会话状态,但本文指出会话状态使用后台线程连接sql server数据库,因此无法连接,因为该线程在ASP.NET工作进程下运行。实际上,这也不起作用,因为我检查了数据库用于从主线程和后台线程进行调用的凭据。事实证明,上面的内容只是模拟我(登录用户),而不是web.config中指定的服务帐户。因为我可以访问数据库,所以调用是成功的,但是当它投入生产时,情况就不是这样了。o现在我正在查看ExecutionContext,看看这是否能给我带来一些东西。。