2015-01-02 9 views
5

ben daha kolay bir şekilde alır ve Mesajlar yürütmek Http Web Request sınıfı için bir Wrapper geliştirdikNET HTTP İstek Zaman Aşımı sürekli akış sitesinde "durduruluyor" değil

Kapsam. Bu kütüphane iki yıldan fazla bir süredir sorunsuzca kullanılıyor, ama bugün garip bir problemle karşılaştık.

one website (yüklenecek bir süreliğine) var. Görünüşe göre, akış karakterlerini HTML ön kısmına saklıyor, böylece kitaplığımız "Al" isteğimiz bir döngüye takılıyor. Http Web İsteği referans baktığımızda

Farklı Zaman Aşımı Özellikleri

iki farklı timeout özellikleri vardır bulmak. İkisini de kullanıyoruz, ancak bunların hiçbiri uygun şekilde iptal edilmiyor.

  • Read Write Timeout - Akışa yazarken veya okurken milisaniye cinsinden zaman aşımı süresini alır veya ayarlar.
  • Timeout - GetResponse ve GetRequestStream yöntemleri için zaman aşımı değerini milisaniye olarak alır veya ayarlar.

Bir Zaman aşımı onlara Kural tüm

bazı önceden yapılandırılmış bir süre sonra bertaraf akışı/bağlantı zorlayacaktır bir "Operasyon Zaman Aşımı" ayarlamak için herhangi bir yolu var mı?

Bazı Kod Numune

public class Program 
{ 
public static void Main() 
{ 
    string url = "http://anus.io"; 

    Console.WriteLine("Initializing Request State Object"); 

    RequestState myRequestState = new RequestState(); 

    // Creating Http Request 
    myRequestState.request = (HttpWebRequest)WebRequest.Create(url); 
    myRequestState.request.Method   = "GET"; 
    myRequestState.request.ReadWriteTimeout = 4000; 
    myRequestState.request.Timeout   = 4000; 

    Console.WriteLine("Begining Async Request"); 


    IAsyncResult ar = myRequestState.request.BeginGetResponse(new AsyncCallback(ResponseCallback), myRequestState); 

    Console.WriteLine("Waiting for Results"); 
    ar.AsyncWaitHandle.WaitOne(); 

    myRequestState.response = (HttpWebResponse)myRequestState.request.EndGetResponse(ar); 
    Console.WriteLine("Response status code = {0}", myRequestState.response.StatusCode); 

} 

public static void ResponseCallback (IAsyncResult asyncResult) 
{ 
    Console.WriteLine("Completed"); 
} 
} 

This Code seem to work fine ama sürekli (tarayıcı gösterdiği gibi) transmited ediliyor beri nasıl ben, dize olarak tepkisini okunur?

Soru

böyle web sitelerini ele uygun yolu nedir? (Sap derken sunucu basitçe aktaran durmayacak durumları belirlemek ve atlamak muktedir demek?)

cevap

1

bu deneyin:

public static void Main() 
{ 

    string url = "http://anus.io"; 

    ***int DefaultTimeOut = 15000;*** //timeout after 15 sec 

    Console.WriteLine("Initializing Request State Object"); 

    RequestState myRequestState = new RequestState(); 

    // Creating Http Request 
    myRequestState.request = (HttpWebRequest)WebRequest.Create(url); 
    myRequestState.request.Method   = "GET"; 
    myRequestState.request.ReadWriteTimeout = 4000; 
    myRequestState.request.Timeout   = 4000; 

    Console.WriteLine("Begining Async Request"); 


    IAsyncResult ar = myRequestState.request.BeginGetResponse(new AsyncCallback(ResponseCallback), myRequestState); 

    ***ThreadPool.RegisterWaitForSingleObject(ar.AsyncWaitHandle, new WaitOrTimerCallback(TimeoutCallback), myRequestState.request, DefaultTimeOut, true);*** 

    Console.WriteLine("Waiting for Results"); 
    ar.AsyncWaitHandle.WaitOne(); 

    try{ 

    myRequestState.response = (HttpWebResponse)myRequestState.request.EndGetResponse(ar); 
    Console.WriteLine("Response status code = {0}", myRequestState.response.StatusCode); 
    }catch(Exception){ 
     Console.WriteLine("Request Aborted"); 
    } 
} 

public static void ResponseCallback (IAsyncResult asyncResult) 
{ 
    Console.WriteLine("Completed"); 
} 

//call the timeout if more than 15 seconds 

**public static void TimeoutCallback(object state, bool timedOut) 
{ 
      if (timedOut) 
      { 
       HttpWebRequest request = state as HttpWebRequest; 
       if (request != null) 
       { 
        request.Abort(); 
       } 
      } 
}** 
0

Ben Task ve kullanıma tüm HTTP işleme hareket edeceğini Bu görev için zaman aşımı koymak için genel bir teknik. Birçok bu tür teknikler mevcuttur.

Neden bu kadar çok bireysel zaman aşımına ihtiyacınız olduğunu anlamıyorum. Sadece şunu söyleyemezsin: Eğer bu talepler 4 saniyeden uzun sürerse, sebebi ne olursa olsun, onu öldür.

APM düzeni ve olayları bekletmek, .NET 4.5 ve C# 5 yaşlarındaki kırmızı bayraklardır. Tüm bu önemsiz kodunuzun amacını gizler. await, WebRequest sınıfı tarafından sağlanan eşzamansız IO'yu kullanmak ve etrafına sarılmış bir genel zaman aşımı tekniği kullanmak için gereksiz yere gider.