سؤال

لدي تطبيق عميل يحاول كل 10 ثوان لإرسال رسالة عبر خدمة WCF Web. سيكون تطبيق العميل هذا على جهاز كمبيوتر على متن سفينة، والتي نعرفها ستتمتع باتصال الإنترنت Spotty. أود أن أحاول التطبيق إرسال البيانات عبر الخدمة، وإذا لم يكن الأمر كذلك، في قائمة انتظار الرسائل حتى تتمكن من إرسالها عبر الخدمة.

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

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

شكرا!

كلا

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

المحلول

لا يمكن إعادة استخدام وكلاء خدمة العملاء بمجرد أن يخطئون. يجب أن تتخلص من القديم وإعادة إنشاء واحدة جديدة.

يجب عليك أيضا التأكد من إغلاق وكيل خدمة العميل بشكل صحيح. من الممكن وجود وكيل خدمة WCF لإلقاء استثناء عند إغلاقه، وإذا حدث هذا يحدث الاتصال غير مغلق، لذلك يجب عليك إحباطه. استخدام نمط "جرب {إغلاق} / catch {avort}". ضع في اعتبارك أيضا أن استدعاءات طريقة التخلص من التخلص من إغلاق (وبالتالي يمكن أن ترمي استثناءا من التخلص)، لذلك لا يمكنك فقط استخدام استخدام مثل الطبقات المتاح العادية.

علي سبيل المثال:

try
{
    if (yourServiceProxy != null)
    {
        if (yourServiceProxy.State != CommunicationState.Faulted)
        {
            yourServiceProxy.Close();
        }
        else
        {
            yourServiceProxy.Abort();
        }
    }
}
catch (CommunicationException)
{
    // Communication exceptions are normal when
    // closing the connection.
    yourServiceProxy.Abort();
}
catch (TimeoutException)
{
    // Timeout exceptions are normal when closing
    // the connection.
    yourServiceProxy.Abort();
}
catch (Exception)
{
    // Any other exception and you should 
    // abort the connection and rethrow to 
    // allow the exception to bubble upwards.
    yourServiceProxy.Abort();
    throw;
}
finally
{
    // This is just to stop you from trying to 
    // close it again (with the null check at the start).
    // This may not be necessary depending on
    // your architecture.
    yourServiceProxy = null;
}

هناك مقال بلوق عن هذا هنا

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