الوصول إلى InstanceContext الحالي في UsernamePasswordValidator WCF

StackOverflow https://stackoverflow.com/questions/3317000

  •  27-09-2020
  •  | 
  •  

سؤال

لدي خدمة WCF تستخدم UsernamePasswordValidator مخصص.يحتاج المدقق إلى الوصول إلى سياق إطار عمل الكيان الخاص بي.

أرغب في إنشاء ObjectContext واحد لاستدعاء الخدمة بالكامل ثم تدميره/التخلص منه في نهاية المكالمة.لذلك قمت بإنشاء فئة ثابتة مفردة توفر هذه الوظيفة، ومع ذلك، ما يحدث الآن هو أنه إذا حدث استدعاءان للخدمة بشكل متزامن، فإن إحدى الاستدعاءات تتخلص من المفرد.

إما أن أحتفظ بمرجع محلي إلى ObjectContext، وفي هذه الحالة تراه الخدمة الثانية التي أستخدمه على أنه تم التخلص منه ويرمي ويحدث خطأ، أو أضع خاصية مجمعة حول فئة Singleton أينما أحتاج إليها ثم يتم طرح جميع التغييرات التي أجريتها بعيدًا لأنني أحصل على مثيل جديد للكائن إذا تخلصت منه مكالمة أخرى.

إذن سؤالي هو كيف يمكنني إنشاء مثيل ObjectContext لكل مكالمة خدمة؟

ملحوظة:يجب أن يكون المثيل قابلاً للوصول في كل من رمز الخدمة ورمز UsernamePasswordValidator المخصص.

لا يمكنني القيام بذلك في المنشئ أو استخدام عبارة الاستخدام لأنه بعد ذلك لا يستطيع UsernamePasswordValidator المخصص الوصول إليه.هل هناك طريقة للحصول على فئة ثابتة لكل مكالمة؟قد يبدو الأمر مستحيلاً، ولكن ما هي الطريقة للتغلب على هذا؟هل يجب أن أقوم بتخزين الكائن مؤقتًا في الجلسة؟

يتم استضافة خدمتي في IIS.

تحديث:
لذلك قمت بتثبيت هذا الأمر لتخزين الحالة في InstanceContext باستخدام كائن IExtension.ولكن كيف يمكنني الوصول إلى InstanceContext الحالي في UsernamePasswordValidator؟

هل كانت مفيدة؟

المحلول

حسنا، لذلك في النهاية حلها باستخدام الفئة الثابتة التالية والاعتماد على ASP.NET لذاكرة التخزين المؤقت للسياق بالنسبة لي.

لست متأكدا مما إذا كانت هذه هي أفضل طريقة للقيام بأشياء، ولكن هذا يتيح لي استخدام موضوع كائن واحد لكل طلب لذلك أنا لا ألغف الكثير وهذا يعني أيضا أنني لا أملك استخدام قفلعلى الكائن الذي سيصبح كابوسا إذا كان العديد من المستخدمين يستخدمون الخدمة.

giveacodicetagpre.

بعد ذلك أينما كنت بحاجة إلى كائن كائن في التطبيق، اتصل بنفسي

giveacodicetagpre.

نصائح أخرى

لديك مثيل واحد لكل مكالمة، ولديك أيضًا مكالمة واحدة لكل مثيل.

لذا يجب أن يكون الأمر بسيطًا جدًا، استخدم a using () { } الحظر في المستوى الأعلى لأسلوب OperationContract الخاص بك.

حسنا، إليك الطبقة ذات الطريقة الثابتة الآمنة الخيط التي توفر كائن نموذج كائن كائن كائن واحد لأي مكالمة خدمة WCF وتخلصها تلقائيا في نهاية المكالمة:

giveacodicetagpre.

لخدمتكم، يمكنك تحديد سلوك خدمة تفاصيل وضع المثيل للخدمة:

giveacodicetagpre.

قد تكون الطريقة الأنظف هي استخدام ServiceAuthenticationManager، الموجود في .NET 4.

http://msdn.microsoft.com/en-us/library/system.servicemodel.serviceauthenticationmanager.aspx

من Authenticate الطريقة (التي ستتجاوزها) يمكنك الوصول إلى كائن الرسالة وتعيين الخصائص عليه.لم أستخدمها في الغضب، لذا YMMV :)

تعديل المشكلة في هذا الأسلوب هي أنك لا تملك اسم المستخدم وكلمة المرور، لذلك ستظل بحاجة إلى المصادقة المخصصة.

ألقِ نظرة على UsernameSecurityTokenAuthenticator...http://msdn.microsoft.com/en-us/library/system.identitymodel.selectors.usernamesecuritytokenauthenticator(v=vs.90).aspx


مزيد من القراءة من بحثي:

تعطي الإجابات على هذا السؤال بعض التلميحات حول كيفية استخدامه:

مصادقة WCF مخصصة مع System.ServiceModel.ServiceAuthenticationManager؟

إذا كنت تستطيع قراءة (أو تجاهل) اللغة الروسية، فقد وجدت تلميحات مفيدة على:

http://www.sql.ru/forum/actualthread.aspx?tid=799046

تذهب مقالة CodeProject الجيدة إلى أبعد من ذلك (التشفير والضغط بالإضافة إلى التفويض المخصص)

http://www.codeproject.com/Articles/165844/WCF-Client-Server-Application-with-Custom-Authenti

لماذا لا تمر في السياق في CustomValidator عند تعيين الخدمة - تخزين سياق كائنك في المصدق الخاص بك، وفي طريقة التحقق من صحة تجاوز التشغيل الجديدة إذا لزم الأمر.ثم لا يزال لديك حق الوصول إلى الكائن من خلال خدمات CutomusernameValidator ..

اعتمادا على ما تسأل: قم بإنشاء فئة ObjectContext منفصلة ككائن ديناميكي - أضف ذلك كخاصية لك CustomValidator. في Validator المخصص الخاص بك - يمكنك الآن التحقق مما إذا تم التخلص من الكائن وإنشاء الكائن مرة أخرى إذا لزم الأمر. خلاف ذلك إذا لم يكن هذا ما أنت عليه بعد - قم بتخزين السياق في المدقق - لا يزال لديك حق الوصول عبر جانب الخادم. الكود هنا هو مجرد فكرة عامة - أنا فقط نشرها كإطار مرجعي حتى تتمكن من الحصول على فكرة عما أتحدث عنه.

giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top