سؤال

طلبت 100 صفحة فقط 404. كتبت

    {
    var s = DateTime.Now;
    for(int i=0; i < 100;i++)
        DL.CheckExist("http://google.com/lol" + i.ToString() + ".jpg");
    var e = DateTime.Now;
    var d = e-s;
        d=d;
        Console.WriteLine(d);
    }

static public bool CheckExist(string url)
{
    HttpWebRequest wreq = null;
    HttpWebResponse wresp = null;
    bool ret = false;

    try
    {
        wreq = (HttpWebRequest)WebRequest.Create(url);
        wreq.KeepAlive = true;
        wreq.Method = "HEAD";
        wresp = (HttpWebResponse)wreq.GetResponse();
        ret = true;
    }
    catch (System.Net.WebException)
    {
    }
    finally
    {
        if (wresp != null)
            wresp.Close();
    }
    return ret;
}

يديران تظهر أنه يستغرق 00: 00: 30.7968750 و 00: 00: 26.8750000. ثم حاولت Firefox واستخدام التعليمات البرمجية التالية

<html>
<body>
<script type="text/javascript">
for(var i=0; i<100; i++)
    document.write("<img src=http://google.com/lol" + i + ".jpg><br>");
</script>

</body>
</html>

باستخدام وقت التسويق الخاص بي والعد، كان ما يقرب من 4 ثوان. 4 ثوان هو 6.5-7.5faster ثم تطبيقي. أخطط للمسح الضوئي من خلال آلاف الملفات، لذلك فإن تناول 3.75 ساعة بدلا من 30 دقيقة ستكون مشكلة كبيرة. كيف يمكنني جعل هذا الرمز أسرع؟ أعلم أن شخصا ما سيقول فايرفوكس تخبط الصور لكنني أريد أن أقول 1) لا يزال يحتاج إلى التحقق من الرؤوس من الخادم البعيد لمعرفة ما إذا كان قد تم تحديثه (وهو ما أريده أن يفعل تطبيقي) 2) أنا لست كذلك تلقي الجسم، يجب أن يطلب التعليمات البرمجية الخاصة بي فقط الرأس. لذلك، كيف يمكنني حل هذا؟

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

المحلول

ربما يصدر Firefox طلبات متعددة في الوقت نفسه في حين أن الكود الخاص بك يفعلها واحدا تلو الآخر. ربما تضيف المواضيع تسريع برنامجك.

نصائح أخرى

لقد لاحظت أن HttpWebRequest معلقة في الطلب الأول. لقد قمت ببعض الأبحاث وما يبدو أنه يحدث هو أن الطلب هو تكوين أو الكشف التلقائي. إذا قمت بتعيين

request.Proxy = null;

على كائن طلب الويب، قد تكون قادرا على تجنب التأخير الأولي.

مع وكيل الكشف التلقائي:

using (var response = (HttpWebResponse)request.GetResponse()) //6,956 ms
{
}

بدون كشف وكيل تلقائي:

request.Proxy = null;
using (var response = (HttpWebResponse)request.GetResponse()) //154 ms
{
}

تغيير الكود الخاص بك إلى getResponse غير متزامن

public override WebResponse GetResponse() {
    •••
    IAsyncResult asyncResult = BeginGetResponse(null, null);
    •••
    return EndGetResponse(asyncResult);
}

async الحصول على

الجواب هو تغيير httpwebrequest / httpwebresponse إلى webrequest / webresponse فقط. التي تم إصلاح المشكلة.

هل حاولت فتح عنوان URL نفسه في IE على الجهاز الذي يتم نشر الكود الخاص بك إليه؟ إذا كان جهاز Windows Server ثم في بعض الأحيان، فهذا لأن عنوان URL الذي تطلبه ليس في قائمة IE (التي تعمل httpWebRequest) قائمة المواقع الآمنة. سوف تحتاج فقط إلى إضافته.

هل لديك المزيد من المعلومات التي يمكنك نشرها؟ لدي شيء مماثل واجهت طن من المشاكل مع httpWebRequest من قبل. كل فريدة من نوعها. لذلك سوف تساعد مزيد من المعلومات.

BTW، لا تساعدها في استخدام طرق ASYNC في هذه الحالة. لا تقصر وقت التنزيل. فقط لا يمنع موضوع الاتصال الخاص بك هذا كل شيء.

أغلق مجرى الاستجابة عند الانتهاء، لذلك في Checkexist ()، أضف WRESP.CLOSE () بعد WRESP = (httpwebresponse) wreq.getResponse ()؛

انقر فوق موافق إذا كنت تحصل على رمز الحالة 404 لجميع صفحات الويب، فمن المقرر أن لا تحدد بيانات الاعتماد. لذلك تحتاج إلى إضافة

wreq.Credentials = CredentialCache.DefaultCredentials;

ثم قد تأتي أيضا عبر رمز الحالة = 500 لذلك تحتاج إلى تحديد وكيل المستخدم. الذي يبدو شيئا مثل الخط أدناه

wreq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0";

"مثيل WebClient لا يرسل رؤوس HTTP اختيارية بشكل افتراضي. إذا كان طلبك يتطلب رأس اختياري، فيجب عليك إضافة رأس إلى مجموعة الرؤوس. على سبيل المثال، للاحتفاظ بالاستعلامات في الاستجابة، يجب عليك إضافة رأس وكيل المستخدم. أيضا، قد تعود الخوادم 500 (خطأ خادم داخلي) إذا كان رأس وكيل المستخدم مفقود. "

المرجعي: https://msdn.microsoft.com/en-us/library/system.net.webclient(v=vs.110).aspx.

لتحسين أداء HttpWebRequest، تحتاج إلى إضافة

wreq.Proxy=null

الآن سوف تبدو الكود:

 static public bool CheckExist(string url)
{
    HttpWebRequest wreq = null;
    HttpWebResponse wresp = null;
    bool ret = false;

try
{
    wreq = (HttpWebRequest)WebRequest.Create(url);
    wreq.Credentials = CredentialCache.DefaultCredentials;
    wreq.Proxy=null;
    wreq.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4.0";
    wreq.KeepAlive = true;
    wreq.Method = "HEAD";
    wresp = (HttpWebResponse)wreq.GetResponse();
    ret = true;
}
catch (System.Net.WebException)
{
}
finally
{
    if (wresp != null)
        wresp.Close();
}
return ret;

}

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