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
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. –