การเลียนแบบ 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 Name ของแต่ละงาน สิ่งที่ฉันได้รับคือ ~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
สวัสดี Henk ขอบคุณสำหรับคำแนะนำ!   -  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