2017-07-12 11 views
1

Ich untersuche ein Problem mit einem älteren Code, der eine HTTP-Anforderung an eine andere URL weiterleitet. Es ist ein API-Controller, der die Anforderung liest und asynchron an eine andere Adresse weiterleitet.HttpClient SendAsync Zugriff auf ein entsorgtes Objekt nicht möglich ResponseHeadersRead

Sehr selten löst es die Ausnahme "Kann auf ein entsorgtes Objekt nicht zugreifen" aus - die vollständige Stapelverfolgung wird später in dieser Frage angezeigt. Es scheint in der Zeile zu sein, in der der HttpClient die SendAsync-Methode aufruft. Ich denke, es könnte die ResponseHeadersRead-Option sein - ich vermute, dass es passiert, wenn ein großes Paket gesendet wird und es geschlossen wird, weil es gerade den Header gelesen und beendet hat. Ich dachte nur, ich würde es vernünftig machen, das mit euch allen zu überprüfen, für eure Gedanken. Ich werde die Option ResponseContentsRead ändern und sehen, wie das geht (aber es kann lange dauern, bis der Fehler auftaucht).

Hier ist der Code:

 using (var client = new HttpClient()) 
     { 
      var request = BuildRelayHttpRequest(Request); 
      await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead); 
     } 


     private static HttpRequestMessage BuildRelayHttpRequest(HttpRequestMessage incomingRequest) 
     { 
      var forwardToUrl = new Uri(ConfigurationManager.AppSettings["ForwardFeedURL"]); 
      var relayRequest = new HttpRequestMessage(incomingRequest.Method, forwardToUrl); 
      if (incomingRequest.Method != HttpMethod.Get && incomingRequest.Content != null) 
      { 
       relayRequest.Content = incomingRequest.Content; 
      } 

      //Copies contents 
      relayRequest.Content = incomingRequest.Content; 
      return relayRequest; 
     } 

Und hier ist die Ausnahme:

System.ObjectDisposedException: Cannot access a disposed object. 
Object name: 'System.Web.Http.WebHost.HttpControllerHandler+LazyStreamContent'. 
    at System.Net.Http.HttpContent.CheckDisposed() 
    at System.Net.Http.HttpContent.CopyToAsync(Stream stream, TransportContext context) 
    at System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar) 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 
    at CHO.Web.Services.ETrains.Controllers.ETrainsApiController.<CopyandForwardFeedAsyn>d__18.MoveNext() in \Controllers\MyAPIController.cs:line 289 

Hinweis, ist 289 Linie die "warten client.SendAsync" Codezeile

Antwort

0

Quoten sind Es gibt einen Fehlercode, der vom Server festgelegt wird.

Folgen Sie Ihren Code mit einem response.EnsureSuccessStatusCode();, die in einem Try-Catch-Block gewickelt ist:

using (var client = new HttpClient()) 
    { 
     var request = BuildRelayHttpRequest(Request); 
     await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead); 
    } 
    try 
    { 
     response.EnsureSuccessStatusCode(); 
     // Handle success 
    } 
    catch (HttpRequestException) 
    { 
     // Handle failure 
    } 

} 
+0

Dank - das jetzt verwenden, um zu versuchen und weitere Informationen zu sammeln, warum es nicht Forwarding sein könnte. Ich werde sehen, wie es läuft und die Ergebnisse aktualisieren. –

Verwandte Themen