4

Ich benutze HttpWebRequest, um einen Web-Service aufzurufen. Wenn der AsyncCallback von BeginGetResponse einen Fehler auslöst, möchte ich ihn an meinen Hauptprogrammablauf weitergeben. Ich habe Probleme damit, weil der Fehler nicht über den AsyncCallback hinaus verbreitet wird. Ich habe probiert versucht/catch Blöcke in jedem Schritt der HttpWebRequest Kette, aber es propagiert nie über die "ResponseCallBack" -Methode. Ist es möglich, es zurück zum Hauptthread zu bekommen?WP7 Ausnahme von BeginGetResponse Callback propagieren

private void StartRequest() 
{ 
    // Code to create request object is here 
    // ... 

    httpRequest.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), httpRequest); 
} 

private void GetRequestStreamCallback(IAsyncResult result) 
{ 
    HttpWebRequest request = (HttpWebRequest)result.AsyncState; 

    // End the operation 
    var postStream = request.EndGetRequestStream(result); 
    string body = GenerateRequestBody(); 

    // Convert the string into a byte array 
    byte[] postBytes = Encoding.UTF8.GetBytes(body); 

    // Write to request stream 
    postStream.Write(postBytes, 0, postBytes.Length); 
    postStream.Close(); 

    // Start the asynchronous operation to get the resonse 
    try 
    { 
     request.BeginGetResponse(new AsyncCallback(ResponseCallback), request); 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
} 

private void ResponseCallback(IAsyncResult result) 
{ 
    string contents = String.Empty; 
    HttpWebRequest request = (HttpWebRequest)result.AsyncState; 
    HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result); 

    using (Stream stream = response.GetResponseStream()) 
    using (StreamReader reader = new StreamReader(stream)) 
    { 
     contents = reader.ReadToEnd(); 
    } 

    // Check the status 
    if (response.StatusCode == HttpStatusCode.OK) 
    { 
     //EXCEPTION NEVER MAKES IT PASSED HERE, EVEN IF I HAVE IT IN A TRY/CATCH BLOCK AND RE-THROW IT. 
     _object = ProcessResponseEntity(contents); 
    } 
} 

Antwort

2

Ich denke, Sie bekommen verwirrt über die Art und Weise asynchronen Code exectution funktioniert und wie die Callback-Ausführung passt mit dem anrufenden Code in.

Innerhalb GetRequestStreamCallback, nach dem Aufruf an request.BeginGetResponse wird die Methode weiterhin ausgeführt und in Ihrem Beispiel einfach zu Ende.

Es ist nicht bekannt, wann (oder auch wenn) ResponseCallback ausgeführt wird oder, was auf dem UI-Thread wird geschehen, wenn es funktioniert. Aus diesem Grund wird ResponseCallback auf einem anderen Thread ausgeführt.

Es ist möglich, Code innerhalb des Callback-Laufs auf dem UI-Thread (den Sie mit der Benutzeroberfläche interagieren möchten) mithilfe von Dispatcher.BeginInvoke ausführen zu lassen. Sie können dies jedoch nicht im Kontext einer anderen Methode ausführen lassen.

Während ich es nicht empfehlen würde, möchten Sie vielleicht einen Blick auf this discussion auf den Callback scheinen synchron ausgeführt werden. Dies wird jedoch den UI-Thread blockieren und wird daher NICHT empfohlen.

Verwandte Themen