Параллельное олицетворение WCF

У меня есть служба WCF с "ImpersonationOption.Required". Похоже, что олицетворение не проходит при использовании параллелизма. Например:

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

Возвращает число с олицетворенным пользователем и число с пользователем пула приложений. Можно ли заставить олицетворение работать с параллелизмом?

Лучший,

Марк

Обновление:

Это фактический код на стороне службы 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?

Спасибо!


person user1582843    schedule 12.09.2012    source источник
comment
Пожалуйста, напишите точный код, это не имеет смысла.   -  person Henk Holterman    schedule 13.09.2012
comment
Я обновил проблему с точным кодом.   -  person user1582843    schedule 25.09.2012
comment
Перепишите это как обычно для каждого цикла (foreach(timer in timers) { results.Add(WindowsIdentity.GetCurrent(false).Name; }), и вы увидите проблему. Вы никогда ничего не делаете с timer внутри цикла, поэтому вы просто выполняете один и тот же код снова и снова, поэтому, конечно, вы получите тот же результат. каждый раз.   -  person Scott Chamberlain    schedule 25.09.2012
comment
Хорошо, гораздо лучше задать вопрос таким образом и даже интересно. Если через сутки не откроется, сделайте репост.   -  person Henk Holterman    schedule 25.09.2012
comment
В качестве объяснения я бы сказал, что основной поток выполняет часть ForEach, олицетворяется, а дополнительные потоки не олицетворяют. Число 10 слишком мало, чтобы получить реальное распределение.   -  person Henk Holterman    schedule 26.09.2012
comment
Привет Хенк, Спасибо за руководство!   -  person user1582843    schedule 27.09.2012


Ответы (1)


Вы должны позаботиться об этом сами. Попробуйте что-то вроде этого:

IntPtr token = WindowsIdentity.GetCurrent().Token;

Parallel.ForEach( Enumerable.Range( 1, 100 ), ( test ) =>
{
    using ( WindowsIdentity.Impersonate( token ) )
    {
          Console.WriteLine( WindowsIdentity.GetCurrent( false ).Name );
    }
} );
person Ivan Zlatanov    schedule 26.09.2012
comment
Это сработало - спасибо! Нам повезло, что мы оборачиваем вызовы Parallel.ForEach в метод расширения, поэтому мне пришлось изменить только одно место. - person user1582843; 27.09.2012