سؤال

عندما أحاول الاتصال بجهاز غير متوفر ، أحصل على نقطة نهاية endpointNotFoundException لكن الأمر يستغرق وقتًا طويلاً (حوالي 20 ثانية). تحديد ClostEtimeout أو OpenTimeOut أو recivetimeout أو sendTimeout ليس له أي تأثير. هل يمكنني الحصول على هذا الاستثناء في وقت سابق؟

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

المحلول

نحن نستخدم كتلة ConnectionMonitor Enterpriselibrary التي تعمل بشكل جيد بشكل معقول ، مع ذلك يمكنك تحديد استراتيجيتك الخاصة لتحديد توفر الاتصال ولكننا نستخدم فقط تلك التي تأتي في المربع.

يستخدم هذا الكود الافتراضي (الذي يتم تشغيله على مؤشر ترابط الخلفية ... معالجته بواسطة الكتلة) هذا داخليًا:

        public bool IsAlive(string hostnameOrAddress)
    {
        bool alive = false;
        try
        {
            Uri address = new Uri(hostnameOrAddress);
            HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(address);
            request.Timeout = 5000;
            using (HttpWebResponse response = (HttpWebResponse) request.GetResponse())
            {
                alive = DoesResponseStatusCodeIndicateOnlineStatus(response);
            }
        }
        catch (WebException wex)
        {
            alive = DoesWebExceptionStatusIndicateOnlineStatus(wex);
        }

        return alive;
    }

ألقِ نظرة على الكتلة نفسها ، ومعرفة ما إذا كان يمكنك استخدامه في مشروعك أو الحصول على بعض الأفكار حول كيفية حل مشكلتك المحددة. (من الذاكرة ، تعد الكتلة جزءًا من مصنع برمجيات العميل الذكي SCSF)

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

نصائح أخرى

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

الحل الموجود هو مزيج من Villintehaspam و وورزاركإجابات. لقد قمت بإنشاء طريقة محلية تدعو الطريقة عن بُعد void isok () بشكل غير متزامن وينتظر لبعض الثواني. إذا استغرق الأمر وقتًا طويلاً ، فأنا أجهض الخيط.

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