سؤال

WebResponse response;
try
{                
 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
 request.Timeout = 20000;
 response = request.GetResponse();

 request = (HttpWebRequest)WebRequest.Create(url2);
 response = request.GetResponse();
}
catch(Exception ex)
{
 //do something
}              
finally
{
}

أين يجب أن يستدعي الاستجابة. كلاوس ()؟

  • بعد كل getResponse () في محاولة؟

  • بعد أخير getResponse () في محاولة - مرة واحدة؟

  • في حظر أخيرا؟
هل كانت مفيدة؟

المحلول

لا شيء مما بالأعلى. يجب أن تستخدم using منع:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 20000;
using (WebResponse response = request.GetResponse())
{
    using (var stream = response.GetResponseStream())
    {
        using (var reader = new StreamReader(stream))
        {
            var result = reader.ReadToEnd();
            // Do something with result
        }
    }
}

أ using سيضمن Block أن يتم استدعاء طريقة الاختطاف، سواء كان هناك استثناء أم لا. التخلص من أن تفعل الشيء نفسه أقرب.

using (var d = new DisposableClass()){code;}

أي ما يعادل:

DisposableClass d = null;
try
{
    d = new DisposableClass();
    code;
}
finally
{
    if (d != null)
        ((IDisposable)d).Dispose();
}

نصائح أخرى

ضعه في كتلة أخيرا. حسب MSDN.:

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

لاحظ أن استخدام الكتل المتداخلة لا تحتاج إلى أقواس مجعد، وتحسين قابلية القراءة. لذلك يمكن كتابة رمز جون Sununder:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Timeout = 20000;
using (WebResponse response = request.GetResponse())
using (var stream = response.GetResponseStream())
using (var reader = new StreamReader(stream))
{
    var result = reader.ReadToEnd();
    // Do something with result
}

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

أود أن أقترح أدناه

        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.google.com");
            request.Timeout = 20000;
            using (var response = request.GetResponse())
            {
                //Do something with response.
            }


            request = (HttpWebRequest)WebRequest.Create("http://www.bing.com");
            using (var response = request.GetResponse())
            {
                //Do somehing with response
            }
        }
        catch (Exception ex)
        {
            //do something
        }
        finally
        {
        }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top