سؤال

هدفي هو إعادة المحاولة غير متزامن HttpWebRequest عندما يفشل.

عندما إحباط() وهو HttpWebRequest لا أستطيع BeginGetResponse() مرة أخرى.وبالتالي فإن الطريقة الوحيدة الطلب مرة أخرى على الأرجح إعادة HttpWebRequest الكائن.يبدو أن تتطلب الكثير من العمل منذ كنت قد نسخ جميع خصائص الكائن القديم.هل هناك أي اختصار ؟

ملاحظة:أعتقد أن هذا التسلسل يمكن أن تحل مشكلتي ، ولكن هذه الفئة لن تسلسل ، كما نوقش في السؤال السابق.

التحديث إزالة المثال التعليمات البرمجية المصدر لأنه كان لا لزوم لها

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

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

المحلول

فمن الممكن!

تحتاج فقط إلى إنشاء جديد HttpWebRequest ونسخ كافة الخصائص إلى أكثر من ذلك من وجوه قديمة عن طريق التفكير.

هنا طريقة التمديد أن يفعل هذا:

/// <summary>
/// Clones a HttpWebRequest for retrying a failed HTTP request.
/// </summary>
/// <param name="original"></param>
/// <returns></returns>
public static HttpWebRequest Clone(this HttpWebRequest original)
{
    // Create a new web request object
    HttpWebRequest clone = (HttpWebRequest)WebRequest.Create(original.RequestUri.AbsoluteUri);

    // Get original fields
    PropertyInfo[] properties = original.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);

    // There are some properties that we can't set manually for the new object, for various reasons
    List<string> excludedProperties = new List<String>(){ "ContentLength", "Headers" };

    // Traverse properties in HttpWebRequest class
    foreach (PropertyInfo property in properties)
    {
        // Make sure it's not an excluded property
        if (!excludedProperties.Contains(property.Name))
        {
            // Get original field value
            object value = property.GetValue(original);

            // Copy the value to the new cloned object
            if (property.CanWrite)
            {
                property.SetValue(clone, value);
            }
        }
    }

    return clone;
}

عندما تريد إعادة إصدار نفس الطلب, ببساطة قم بتنفيذ التالي:

// Create a request
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("https://www.google.com/");

// Change some properties...

// Execute it
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

// Clone the request to reissue it using our extension method
request = request.Clone();

// Execute it again
response = (HttpWebResponse)request.GetResponse();

نصائح أخرى

ليس من الممكن.

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

في الأساس, يعتقد HTTPWebRequest سبيل المثال هو نوع من المصنع ، لكنها في الحقيقة الملموسة.لديك لإنشاء مثيل آخر.

أين أنت تحاول تسلسل الطلب ؟ قد تكون فكرة جيدة أن تسلسل الطلب قبل كنت في محاولة لجعل ذلك ، ومن ثم إرسال طلب على الفشل (من تسلسل سبيل المثال).

أيضا, قد ترغب في إزالة البروكسي, تسلسل سبيل المثال ، ثم تعيين الوكيل مرة أخرى, ومنذ ذلك يبدو أن مكمن المشكلة في التسلسلية الطلب.

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

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