سؤال

أقوم بإنشاء برنامج يتصل بموقع ويب ويقوم بتنزيل XML منه.ومن ثم يعرض المعلومات للمستخدم.

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

أستخدم حاليًا HttpWebRequest لتنزيل الدفق وStreamReader لقراءته.ثم أقوم بتحليل XML باستخدام XLINQ.

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

المحلول

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

//internally sets "ProxySet" to true, so won't search for a proxy
request.Proxy = null;

ويمكنك أيضا تحديد ذلك في .config:

<system.net>
  <defaultProxy
    enabled="false"
    useDefaultCredentials="false" >
    <proxy/>
    <bypasslist/>
    <module/>
  </defaultProxy>
</system.net>

نصائح أخرى

يمكن أن يكون التأخير في المرة الأولى نتيجة لمجموعة مما يلي:

  1. حان الوقت لحل إدخال DNS الخاص بالخادم
  2. حان الوقت لتنزيل البرنامج النصي AutoConfig Proxy ، وتجميعه وتنفيذه لتحديد الوكيل الفعال
  3. زمن وصول الشبكة من تطبيقك إلى الخادم الوكيل (إذا كان هناك خادم وكيل في بيئتك)
  4. زمن انتقال الشبكة من خادم الوكيل إلى خادم الوجهة الفعلي.
  5. الكمون على الخادم لخدمة مستند XML.إذا كان عليها اجتياز تمثيل كائن في الذاكرة وإنشاء مستند XML ، فقد يستغرق ذلك بعض الوقت.أيضًا ، إذا كانت تستخدم تقنيات مثل XML-Serialization لإنشاء المستند ، فعندئذٍ ، بناءً على كيفية تكوين المسلسل ، فإن الدعوة الأولى لتسلسلها/إزالة التسلس وتجميع.
  6. قد يستغرق تحليل XML على جانب العميل وقتًا ، ESP إذا كان بنية مستند XML معقدة للغاية.
  7. إذا كان XlinQ (مثل XmlSerializer) يولد مجموعة مؤقتة لحلية XML والاستعلام ، فإن الطلب الأول سيستغرق وقتًا أطول أكثر من التقدير اللاحق.

لمعرفة الجزء الذي يستغرق وقتًا، أدخل بعض الوقت في تسجيل الدخول إلى التعليمات البرمجية الخاصة بك باستخدام System.Diagnostics.Stopwatch():

// this is the time to get the XML doc from the server, including the time to resolve DNS, get proxy etc.
System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
timer.Start();
HttpWebResponse resp = (HttpWebResponse)request.GetResponse();
timer.Stop();
Console.WriteLine("XML download took: " + timer.ElapsedMilliseconds);

timer.Start();
// now, do your XLinq stuff here...
timer.Stop();
Console.WriteLine("XLinq took: " + timer.ElapsedMilliseconds);

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

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

أتمنى أن يساعدك هذا.

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

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