استخدام HttpWebRequest لتنزيل صفحات HTML إرجاع ContentLength as -1

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

سؤال

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

ومع ذلك عندما أستخدم

WebRequest.Create ("http://www.stackoverflow.com/")؛ webrequest.getResponse ()؛

httpwebresponse.contentlength هو دائما -1. لا بد لي من إظهار التقدم المحرز في هذه الصفحات التي تنزيل، في إصدار VB6 الموجود لدينا، نحن نستخدم التحكم في INET ويقرف التقدم بشكل جيد.

تشبه الرمز الخاص بي إلى هذا:

http://www.geelpedia.com/tutorial179_creating-a-download-manager-in-csharp.html.

(طريقة التنزيل "التي هي)

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

شكرا،

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

المحلول

ها هي عينة باستخدام العميل على شبكة الإنترنت بامكانك ان تحاول:

class Program
{
    static void Main(string[] args)
    {
        var client = new WebClient();
        client.DownloadProgressChanged += (sender, e) =>
        {
            Console.WriteLine("{0}% completed", e.ProgressPercentage);
        };
        client.DownloadStringCompleted += (sender, e) =>
        {
            // e.Result contains downloaded string
            Console.WriteLine("finished downloading...");
        };
        client.DownloadStringAsync(new Uri("http://www.stackoverflow.com"));
        Console.ReadKey();
    }
}

إذا قررت استخدامه في تطبيق WinForms تأكد من الاتصال invokerquired./يستحضر نمط من معالجات الأحداث كما لا يتم تنفيذها على مؤشر ترابط UI.

نصائح أخرى

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

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

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

لاحظ أن نهج واحد مشترك هو إظهار شريط التقدم الذي يشير إلى "أحرز تقدما" ولكن لا يحاول تخمين مقدار اليسار للتنزيل.

يعتمد التعليمات البرمجية في طريقة التنزيل () في المقالة المرتبطة على الأعضاء الخاصين في الفصل، رغم ذلك

WebRequest.Create ("http://www.stackoverflow.com")؛

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

webrequest.getResponse ()؛

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

لذلك حاول وضع الخطوط

خاص httpwebrequest webrequest؛ httpwebresponse الخاص Webresponse؛

خارج الطريقة في الجزء العلوي من الصف كامرطيات من كائنات WebRequest و WebResponse.

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