2009-08-05 10 views
1

Ich benutze Webrequest, um einige Bilddaten zu holen. Die URL könnte irgendwann ungültig werden. Im Falle einer ungültigen URL benötigt begingetresponse Zeit, die der Timeout-Zeit entspricht. Außerdem reagiert das Steuerelement während dieses Zeitraums nicht mehr. Mit anderen Worten funktioniert der asynchrone Rückruf nicht asynchron. Ist das erwartetes Verhalten?webrequest.begingetresponse benötigt zu viel Zeit, wenn die URL ungültig ist

try 
           { 
            // Async requests 
            WebRequest request = WebRequest.Create(uri); 
            request.Timeout = RequestTimeOut; 
            RequestObject requestObject = new RequestObject(); 
            requestObject.Request = request; 
            request.BeginGetResponse(this.ProcessImage, requestObject); 
           } 
           catch (Exception) 
           { 
            ShowErrorMessage(uri); 
           } 

private void ProcessImage(IAsyncResult asyncResult) 
     {    
      try 
      { 
       RequestObject requestObject = (RequestObject)asyncResult.AsyncState; 
       WebRequest request = requestObject.Request; 
       WebResponse response = request.EndGetResponse(asyncResult); 

       Bitmap tile = new Bitmap(response.GetResponseStream()); 
       // do something 
      } 
      catch (Exception) 
      { 
       ShowErrorMessage(); 
      } 
     } 
+0

Nein, erwartetes Verhalten wäre, dass die Benutzeroberfläche reagiert, wenn Sie BeginGetResponse verwenden. Können Sie uns einen Code-Ausschnitt zeigen, in dem Sie BeginGetResponse aufrufen? – bernhof

+0

Haben Sie eine Möglichkeit, diese URL zu validieren, bevor Sie sie senden? Ich vermute, dass der Server, den Sie anfordern, eine Blackbox für Sie ist, haben Sie keinen Zugriff auf diesen Code? – Sebastian

+0

Ich denke, ich muss die URL vor der Verwendung validieren, anstatt blind die URL zu verwenden. Muss mehr Code schreiben :( – malay

Antwort

2

sieht wie folgt ein Problem mit .NET ist. BeginGetResponse blockiert, bis DNS aufgelöst wird. Bei falscher URL (wie http://somecrap) versucht es, bis es Timeout bekommt. Siehe die folgenden Links - link1 und link2

1

Ich lief gerade in derselben Situation. Obwohl es keine perfekte Problemumgehung ist, entschied ich mich, die Ping.SendAsync() zu verwenden, um zuerst die Site zu pingen. Guter Teil ist die asynchrone Teilrückgabe sofort. Schlechtes Teil ist der zusätzliche Schritt UND nicht alle Seiten antworten auf Ping-Anfragen.

public void Start(WatchArgs args) 
{ 
     var p = new System.Net.NetworkInformation.Ping(); 
     args.State = p; 
     var po = new System.Net.NetworkInformation.PingOptions(10, true); 
     p.PingCompleted += new PingCompletedEventHandler(PingResponseReceived); 
     p.SendAsync(args.Machine.Name, 5 * 1000, Encoding.ASCII.GetBytes("watchdog"), po, args); 
} 

private void PingResponseReceived(object sender, .PingCompletedEventArgs e) 
{ 
    WatchArgs args = e.UserState as WatchArgs; 
    var p = args.State as System.Net.NetworkInformation.Ping; 
    p.PingCompleted -= new System.Net.NetworkInformation.PingCompletedEventHandler(HttpSmokeWatcher.PingResponseReceived); 
    args.State = null; 
    if (System.Net.NetworkInformation.IPStatus.Success == e.Reply.Status) 
    { 
     // ... BeginGetResponse now 
    } 
    else 
    { 
     /// ... machine not available 
    } 
} 

Nur Code und läuft für einen Tag, aber das erste Ergebnis sieht vielversprechend aus.

+0

Danke. Das ist wirklich nützlich. – malay