代码之家  ›  专栏  ›  技术社区  ›  Nathan

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

  •  0
  • Nathan  · 技术社区  · 16 年前

    我正在从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 FireAllAsync 使用线程失败,出现401错误。我认为凭证没有正确通过的问题。ie这行代码如下:

    rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
    

    我对凭证缓存的工作原理没有很好的理解,因此我无法理解为什么它不喜欢处于单独的线程中。

    1 回复  |  直到 16 年前
        1
  •  3
  •   TristanK    16 年前

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

    代表团

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

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

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

    如果不是,401村。

    http://geekswithblogs.net/khanna/archive/2005/02/09/22441.aspx

    http://aspalliance.com/articleViewer.aspx?aId=650&pId=2