C# 在另一个线程中使用SSRS Web服务

C# 在另一个线程中使用SSRS Web服务,c#,asp.net,web-services,multithreading,reporting-services,C#,Asp.net,Web Services,Multithreading,Reporting Services,我正在从asp.net应用程序内部调用SQL Server Reporting Services Web服务。我需要取消对给定报告的所有订阅。但是我不希望用户必须等待它全部发生,所以我希望所有的webservice调用都在一个单独的线程中,并立即返回给用户 我使用的代码如下所示: public static void FireAllAsync(string ReportPath) { Hashtable paramValues = new Hashtable(); ThreadP

我正在从asp.net应用程序内部调用SQL Server Reporting Services Web服务。我需要取消对给定报告的所有订阅。但是我不希望用户必须等待它全部发生,所以我希望所有的webservice调用都在一个单独的线程中,并立即返回给用户

我使用的代码如下所示:

public static void FireAllAsync(string ReportPath)
{
    Hashtable paramValues = new Hashtable();
    ThreadPool.QueueUserWorkItem(new WaitCallback(FireAll), ReportPath);
}

public static void FireAll(object ReportPath)
{

    ReportingService rs = new ReportingService();
    rs.Credentials = System.Net.CredentialCache.DefaultCredentials;

    Subscription[] SubList = rs.ListSubscriptions((string)ReportPath, null);

    foreach (Subscription CurSub in SubList) {
        rs.FireEvent(CurSub.EventType, CurSub.SubscriptionID);
    }

}
调用
FireAll
工作正常,但尝试调用
fireallalsync
以使用线程失败,并出现401错误。我认为凭证没有正确通过的问题。ie这行代码如下:

rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
我对凭证缓存的工作原理没有很好的理解,因此我无法理解为什么它不喜欢处于单独的线程中

我曾尝试在外部函数中获取凭据,并将它们作为参数传递,但出现了相同的错误


有人知道会发生什么吗?

当主线程执行时,它会为它准备一个模拟上下文。在经过身份验证的场景中,IIS已对用户进行身份验证,然后为该用户设置线程令牌(而不是进程令牌)

因为线程令牌是为用户设置的,所以该线程可以代表用户(在本地框上;在另一个框上代表用户操作需要设置委派(如果使用集成Windows身份验证(NTLM/Kerberos))

但是,如果您派生一个没有任何标识信息的工作线程,那么该工作线程将在没有自己的令牌的情况下生成,因此它将使用进程令牌

如果您可以在初始线程上执行您需要执行的操作,那么就不会有委派问题,只是工作线程上缺少用户令牌

Threadpool线程将作为进程标识运行(默认情况下是NetworkService,因此主机的计算机帐户,除非您的应用程序池设置为以SomeUser身份运行,在这种情况下,所有工作线程都将以SomeUser身份运行)-如果该用户可以访问初始用户想要的任何内容,则一切正常

如果不是,401村

有一些网络参考可以帮助解决这一问题,并提供各种可能的答案:


当主线程执行时,它会为其准备一个模拟上下文。在经过身份验证的场景中,IIS已对用户进行身份验证,然后为该用户设置线程令牌(而不是进程令牌)

因为线程令牌是为用户设置的,所以该线程可以代表用户(在本地框上;在另一个框上代表用户操作需要设置委派(如果使用集成Windows身份验证(NTLM/Kerberos))

但是,如果您派生一个没有任何标识信息的工作线程,那么该工作线程将在没有自己的令牌的情况下生成,因此它将使用进程令牌

如果您可以在初始线程上执行您需要执行的操作,那么就不会有委派问题,只是工作线程上缺少用户令牌

Threadpool线程将作为进程标识运行(默认情况下是NetworkService,因此主机的计算机帐户,除非您的应用程序池设置为以SomeUser身份运行,在这种情况下,所有工作线程都将以SomeUser身份运行)-如果该用户可以访问初始用户想要的任何内容,则一切正常

如果不是,401村

有一些网络参考可以帮助解决这一问题,并提供各种可能的答案:


哦,天哪。这是一个很好的回答!我希望我能给你不止一票。谢谢希望它能为您带来解决方案!哦,老兄。这是一个很好的回答!我希望我能给你不止一票。谢谢希望它能为您带来解决方案!