0

asp.net 응용 프로그램 내부에서 SQL Server Reporting Services Webservice를 호출합니다. 주어진 보고서에 대한 모든 구독을 해고해야합니다. 그러나 나는 모든 일이 일어나기를 기다려야하는 사용자를 원하지 않기 때문에 모든 웹 서비스 호출을 별도의 스레드 안에두고 사용자에게 즉시 반환하고 싶습니다. 나는이 같은 형태의 코드를 사용하고다른 스레드 내에서 SSRS 웹 서비스 사용

:

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는 사용자를 인증 한 다음 해당 사용자에 대한 프로세스 토큰이 아닌 스레드 토큰을 설정합니다.

스레드 토큰이 사용자를 위해 설정되었으므로 해당 스레드는 로컬 상자에서 사용자를 대신하여 작동 할 수 있습니다 (다른 상자의 사용자 대신에 위임이 필요함) 인증 (NTLM/Kerberos)이 사용됩니다.

그러나 신원 정보없이 작업자 스레드를 스핀 오프하면 해당 작업자 스레드가 자체 토큰없이 생성되어 프로세스 토큰을 사용하게됩니다.

초기 스레드에서 수행해야 할 작업을 수행 할 수 있으면 작업 스레드에서 사용자 토큰이 부족하여 위임 문제가 발생하지 않습니다.

스레드 풀 스레드는 프로세스 ID (기본적으로 NetworkService로 실행되므로 응용 프로그램 풀이 SomeUser로 실행되도록 설정되지 않은 경우 호스팅 컴퓨터의 컴퓨터 계정이므로 모든 작업자 스레드가 SomeUser로 실행 됨) - 해당 사용자가 초기 사용자가 원하는 모든 항목에 액세스 할 수 있으면 모든 것이 좋습니다.

그렇지 않으면 401sville.

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

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

+0

사람 아 :

다양한 가능한 답변,이 문제를 해결을 도울 수있는 웹 참조가 있습니다. 그것은 대단한 답변이었습니다! 나는 당신에게 1 표 이상을 줄 수 있었으면 좋겠다. 감사! – Nathan

+0

희망은 당신을위한 해결책으로 인도합니다! – TristanK

관련 문제