2012-09-12 5 views
4

"ImpersonationOption.Required"가있는 WCF 서비스가 있습니다. 병렬 처리를 사용할 때 가장 (impersonation)이 진행되지 않는 것 같습니다. 예 :WCF 병렬 가장

Parallel.ForEach(items => results.Add(SystemUtil.WindowsUser.Name) 

가장 된 사용자의 번호와 앱 풀 사용자의 번호를 반환합니다. 병렬 처리가 가능하도록 가장 (impersonation)을 만들 수 있습니까?

최저

,

마크

업데이트 :

이것은 IIS 서비스 측면에서 실제 코드입니다.

[OperationBehavior(Impersonation = ImpersonationOption.Required)] 
public string[] WhoAmI(int numOfTests) 
{ 
    var tests = new List<int>(); 
    for (var i = 0; i < numOfTests; i++) 
     tests.Add(i); 

    var results = new ConcurrentBag<string>(); 
    Parallel.ForEach(tests, (test) => results.Add(WindowsIdentity.GetCurrent(false).Name)); 
    return results.ToArray(); 
} 

numOfTests = 10을 전달하면 10 개의 작업이 생성되고 각 작업의 WindowsIndentity 이름이 반환됩니다. 내가 얻는 것은 ~ 70 %의 "IIS APPPOOL.NET v4.0"과 ~ 30 %입니다.

내 신원이 항상 Parallel.ForEach에 들어가도록 설정할 수 있습니까?

감사합니다.

+1

정확하게 코드를 입력하십시오.이 의미가 없습니다. –

+0

정확한 코드로 문제를 업데이트했습니다. – user1582843

+0

이것을 정상으로 다시 작성하십시오. 각 루프 (foreach (timer in timers) {results.Add (WindowsIdentity.GetCurrent (false) .Name;}')에서 문제가 발생합니다. '루프 안에서 동일한 코드를 반복해서 실행하므로 매번 동일한 결과를 얻을 수 있습니다. –

답변

2

자신을 돌봐야합니다. 다음과 같이 시도하십시오.

IntPtr token = WindowsIdentity.GetCurrent().Token; 

Parallel.ForEach(Enumerable.Range(1, 100), (test) => 
{ 
    using (WindowsIdentity.Impersonate(token)) 
    { 
      Console.WriteLine(WindowsIdentity.GetCurrent(false).Name); 
    } 
}); 
+0

이 덕분에 고마워! 우리는 Parallel.ForEach를 확장 메서드로 랩핑했기 때문에 운 좋게도 한 곳에서 변경해야했습니다. – user1582843