كيف يقوم خادم WCF بإبلاغ عميل WCF حول التغييرات؟ (حلا أفضل ثم الاقتراع البسيط، مثل المذنب أو الاقتراع الطويل)

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

سؤال

أنظر أيضا "WCF دفع إلى العميل من خلال جدار الحماية"

أحتاج إلى الحصول على عميل WCF الذي يتصل بخادم WCF، ثم عندما بعض البيانات التغييرات على الخادم يحتاج العملاء إلى تحديث عرضها.

كما يحتمل أن يكون هناك جدار حماية بين العملاء والخادم.

  • يجب أن تكون جميع الاتصالات عبر HTTP
  • لا يمكن للخادم إجراء مكالمة صادرة (مادية) للعميل.

كما أكتب كل من العميل والخادم لا أحتاج للحد من الحل فقط باستخدام الصابون وما إلى ذلك.


أنا أبحث عن بنيت في فارس ل "الاقتراع الطويل" / "مذنب" إلخ


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

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

المحلول

يبدو لي مثلك تعرف بالفعل الجواب: استخدم الاقتراع الطويل. :) لذلك أعتقد أن الشيء الوحيد المتبقي لشرح هو كيف قد تكون قادرا على إنجاز هذا مع WCF والطريقة الأكثر فعالية ممكنة.


أساسيات:

  1. أولا، قرر كم من الوقت تريد أن تكون كل "استطلاع طويل". من أجل الحجة، سأختار مهلة 5 دقائق.
  2. على جانب العميل ملزمة، تغيير sendTimeout="00:05:00".
  3. تماما مثل استخدام XMLHTTPRECEEST (XHR) للاقتراع الطويل، عند حدوث المهلة في الواقع، ستحتاج إلى اكتشافها وإعادة إصدار طلب الاقتراع التالي. هذا سهل للغاية في WCF لأن هناك استثناء معين، TimeoutException, ، يمكنك الاحتفاظ بالكشف بسهولة عن هذه القضية مقابل استثناء آخر.
  4. اعتمادا على كيفية استضافة خدمة WCF الخاصة بك، ستحتاج إلى التأكد من تكوين نفسك للسماح بالمعالجة لمدة تصل إلى 5 دقائق. من منظور WCF نقي، ستحتاج إلى التأكد من ضبطك receiveTimeout="00:05:00". وبعد ومع ذلك، إذا كنت تستضيف داخل ASP.NET، فستحتاج أيضا إلى تكوين وقت تشغيل ASP.NET للحصول على مهلة أعلى يتم ذلك باستخدام <httpRuntime executionTimeout="300" /> (ملاحظة: القياسات هي في ثوان لهذه السمة).

أن تكون فعالة في العميل

إذا قمت فقط بإعداد عميلك للمتذل بشكل متزامن للخدمة وكتل العميل لمدة 5 دقائق أثناء انتظار الاستجابة، فهذا ليس استخداما فعالا للغاية لمواردات النظام. يمكنك وضع هذه الدعوات على خيوط المعلومات الأساسية، ولكن هذا ما زال سيعض على مضغ مورد مؤشر ترابط أثناء الدعوة رائعة. الطريقة الأكثر كفاءة للتعامل معها هي استخدام عمليات ASYNC.

إذا كنت تقوم بإنشاء عقود الخدمة الخاصة بك باليد، أود أن أقترح التحقق هذا القسم على MSDN على OperationContractAttribute.AsyncPattern للحصول على تفاصيل حول كيفية إضافة BeginXXX/EndXXX الزوج طريقة ASYNC لكل من مكالماتك. ومع ذلك، إذا كنت تستخدم svcutil لتوليد عقود التشغيل الخاصة بك بالنسبة لك، كل ما عليك القيام به للحصول على طرق ASYNC التي تم إنشاؤها /async الخيار في سطر الأوامر. لمزيد من التفاصيل حول هذا الموضوع، تحقق من الموضوع المتزامن وغير المتزامن على MSDN.

الآن بعد أن تحدد عمليات Async الخاصة بك، فإن النمط يشبه إلى حد كبير العمل مع XHR. أنت تسمون BeginXXX الطريقة التي تمر أ AsyncCallback مندوب. وبعد ال BeginXXX سوف تعيدك الطريقة IAsyncResult, ، والتي يمكنك إتمامها إذا كنت ترغب في أن تكون قادرا على الانتظار على العملية (في سيناريوهات أكثر تقدما) أو تجاهلها، ثم تقوم البنية التحتية WCF بإرسال الطلب إلى الخادم بشكل غير متزامن وانتظر استجابة وراء الكواليس. عند استلام الرد أو يحدث استثناء، رد الاتصال الذي مرته فيه BeginXXX سيتم استدعاء الأسلوب. داخل طريقة رد الاتصال هذه تحتاج إلى استدعاء المقابلة EndXXX طريقة تمر IAsyncResult يتم تسليمها لك. خلال الدعوة إلى EndXXX الطريقة التي تحتاجها لتوظيف معالجة استثناء للتعامل مع أي نوع من أنواع منطقية قد حدث أثناء الاتصال بالطريقة، ولكن هذا هو أيضا حيث يمكنك الآن التقاط TimeoutException تحدثنا عن وقت سابق. على افتراض أنك حصلت على استجابة جيدة، ستكون البيانات عادت من EndXXX اتصل ويمكنك أن تتفاعل مع تلك البيانات بأي طريقة منطقية.

ملاحظة: شيء واحد يجب وضعه في الاعتبار حول هذا النمط هو طبيعة الخيوط. سيتم استلام احتياطيات ASYNC من WCF على مؤشر ترابط تجمع الخيط المدارة. وبعد إذا كنت تخطط لتحديث واجهة المستخدم في تقنية مثل WPF أو WinForms، فأنت بحاجة إلى التأكد من أنك تتنظيم المكالمات مرة أخرى إلى مؤشر ترابط UI باستخدام Invoke أو BeginInvoke طرق.

أن تكون فعالا على الخادم

إذا سنكون قلقين بشأن الكفاءة في العميل، فيجب أن نكون مضاعفة لذلك عندما يتعلق الأمر بالخادم. من الواضح أن هذا النوع من النهج يضع المزيد من الطلب على جانب الخادم لأن الاتصال يجب أن يبقى مفتوحا ولقب في انتظاره حتى يكون هناك سبب لإرسال الإشعار مرة أخرى إلى العميل. التحدي هنا هو أنك تريد فقط ربط وقت تشغيل WCF مع معالجة هؤلاء العملاء الذين يتم إرسال حدث بالفعل. كل شيء آخر يجب أن يكون نائما، في انتظار حدوث الحدث. لحسن الحظ نفس نمط ASYNC الذي استخدمناه للتو على جانب العميل يعمل أيضا على جانب الخوادم. ومع ذلك، هناك الآن فرق كبير: الآن أنت يجب أن تعيد IAsyncResult (وبالتالي WaitHandle) من BeginXXX الطريقة التي ستنظر بها وقت تشغيل WCF بعد ذلك قبل الاتصال بك EndXXX طريقة.

سوف تفعلها ليس ابحث عن الكثير في طريقة الوثائق داخل MSDN بخلاف الروابط التي قدمتها مسبقا سابقا، وللأسف، فإن عيناتها الخاصة بهم في كتابة خدمة ASYNC أقل من مفيدة. هكذا قال، كتب Wenlong Dong قطعة حول تحجيم خدمات WCF مع نموذج Async منذ بعض الوقت أنني أوصي بشدة بفحص.

أبعد من ذلك، أنا بصراحة لا أستطيع أن أعطي الكثير من النصائح حول أفضل السبل لتنفيذ النموذج غير المتزامن على جانب الخادم لك بضربه يعتمد بالكامل على أي نوع من مصدر البيانات سوف تأخر أحداثك من في المقام الأول. ملف I / O؟ قائمة انتظار الرسائل؟ قاعدة البيانات؟ بعض البرامج الإلكترونية الأخرى مع خدمة المراسلة الخاصة بها التي تحاول تقديم الواجهات؟ لا أعرف، لكن يجب أن يقدمون جميعا نماذج Async الخاصة بهم من خلالها التي يمكنك إعادتها إلى خدمتك الخاصة لجعلها فعالة قدر الإمكان.

تحديث وصفة طبية

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

نصائح أخرى

إذا كان بإمكان الخادم إجراء اتصال صادر ب حافلة خدمة، فيمكنك نما نماذج من المكالمة مرة أخرى. بهذه الطريقة، لن يحتاج العميل / الخادم إلى معرفة بعضنا البعض على الإطلاق، فقط حافلة الخدمة. يرى .NET خدمة الحافلة

سوف ترغب في النظر في wsdualhttpbinding.

يوفر Wsdualhttpginding نفس الدعم لبروتوكولات خدمة الويب باعتبارها WshTTPBILTING، ولكن للاستخدام مع عقود دوبلكس. يدعم WSDualhttpBinding فقط أمان الصابون ويتطلب رسائل موثوقة. يتطلب هذا التوصيل أن يكون العميل لديه URI عام يوفر نقطة نهاية اتصال للخدمة. يتم توفير ذلك من قبل clientbaseaddress. ترفع ملزمة مزدوجة عنوان IP للعميل بالخدمة. يجب على العميل استخدام الأمان للتأكد من أنه يتصل فقط بالخدمات التي يثق بها.

في حين أن WCF لا يمكنك محاولة استخدام XMPP للحصول على هذه الوظيفة تسير. هناك مقال عن usq. حول هذا الموضوع والأنظمة الأخرى. بينما تنص المقال على أنه لا يمكن استخدام XMPP عبر HTTP، يمكنك عند استخدامه كلام فارغ.

هناك .NET مكتبات المتاحة agsxmpp. لتسمية واحد.

بدأت الشركة التي أعمل فيها استخدامها لدفع إعلامات التحديث إلى تطبيق لتحديث أجزاء واجهة المستخدم.

جوجل ل "WCF دوبلكس". لقد استخدمت هذا بنجاح باستخدام Nettcpbinding (عبر القارات)، لكنني لست متأكدا من basichttpbinding.

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

إذا كان الخادم لا يستطيع الاتصال بالعميل (ويجب ألا يحدث ذلك عادة)، فيجب أن يكون لديك عميل استطلاع الخادم كما حددته. نظرا لأن لديك مؤسسة WCF موجودة بالفعل، فما عليك سوى إضافة عملية لذلك.

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