2009-03-05 47 views
0

我從asp.net應用程序中調用SQL Server Reporting Services Webservice。我需要關閉某個報告的所有訂閱。但我不希望用戶不得不等待所有事情發生,因此我希望將所有webservice調用放在單獨的線程中,並立即返回給用戶。在另一個線程中使用SSRS 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錯誤。我相信憑證的問題沒有得到正確的傳遞。即這行代碼在這裏:

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

我沒有憑據如何緩存的作品有很好的理解,所以我想不通爲什麼它不喜歡在一個單獨的線程之中。

我已經嘗試在外部函數中抓取憑據,並將它們作爲參數傳遞,但發生同樣的錯誤。

有沒有人有任何想法可能發生什麼?

回答

3

當您的主線程正在執行時,它爲其準備了一個模擬上下文。在已驗證的方案中,IIS已對用戶進行身份驗證,然後爲該用戶設置線程令牌 - 而不是進程令牌。

由於爲用戶設置了線程令牌,因此該線程可以代表用戶(在本地框上;代表用戶在另一個框上執行操作)需要代表團,以便在集成Windows使用身份驗證(NTLM/Kerberos))。

但是,如果您剝離了一個沒有任何身份信息的工作線程,那麼該工作線程將被衍生出來而沒有自己的標記,因此它將使用流程標記。

如果您可以在初始線程上執行您需要執行的操作,那麼您沒有委派問題,只是缺少工作線程上的用戶令牌。

線程池線程將作爲進程標識運行(NetworkService默認情況下爲主機的計算機帳戶,除非您的App Pool設置爲以SomeUser方式運行,在這種情況下,所有工作線程將像SomeUser一樣運行)如果該用戶可以訪問最初用戶想要的任何內容,則一切都很好。

如果不是,401sville。

有Web引用,可以幫助解決這個問題,有各種可能的答案:

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

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

+0

哦男人。這是一個很好的答案!我希望我能給你1票以上的票數。謝謝! – Nathan 2009-03-05 07:11:38

相關問題