ObjectDisposedException sur HttpClient
J'ai un Windows Universelle Projet avec de multiples appels de l'API.
Une méthode refuse de travailler mêmela pensée mes autres appels fonctionnent parfaitement comme ça.
J'ai essayé le using
mot-clé de la pensée, il permettrait de résoudre la question.
La fonction:
public async Task<User> GetNewUser(string user_guid, OAuthTokens OAuth)
{
String userguidJSON = VALIDJSON_BELIEVE_ME;
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Authorization", Encrypt(OAuth.Accesstoken));
using (HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, BASE_URL + URL_USERS + "/data"))
{
req.Content = new StringContent(userguidJSON, Encoding.UTF8, "application/json");
await httpClient.SendAsync(req).ContinueWith(respTask =>
{
Debug.WriteLine(req.Content.ReadAsStringAsync()); //Error is thrown ono this line
});
return null;
}
}
}
MODIFIER
public async Task<User> GetNewUser(string user_guid, OAuthTokens OAuth)
{
String userguidJSON = VALIDJSON_BELIEVE_ME;
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Authorization", Encrypt(OAuth.Accesstoken));
using (HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Post, BASE_URL + URL_USERS + "/data"))
{
req.Content = new StringContent(userguidJSON, Encoding.UTF8, "application/json");
await httpClient.SendAsync(req);
var result = await req.Content.ReadAsStringAsync(); //Cannot access a disposed object. Object name: 'System.Net.Http.StringContent'.
Debug.WriteLine(result);
return null;
}
}
}
La stacktrace
at System.Net.Http.HttpContent.CheckDisposed()
at System.Net.Http.HttpContent.ReadAsStringAsync()
at Roadsmart.Service.RoadsmartService.<GetNewUser>d__2e.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at Roadsmart.ViewModel.SettingsPageViewModel.<SetNewProfilePicture>d__1e.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>b__3(Object state)
at System.Threading.WinRTSynchronizationContext.Invoker.InvokeCore()
Pourquoi êtes-vous de mélange
Pourquoi êtes-vous à l'aide de
await
avec ContinueWith
?Pourquoi êtes-vous à l'aide de
ContinueWith
? Vous n'avez pas besoin d'utiliser ContinueWith
lorsque vous traitez avec async/await.OriginalL'auteur tim | 2015-03-31
Vous devez vous connecter pour publier un commentaire.
ObjectDisposedException
est levée, car vous êtes l'élimination de laHttpRequestMessage
etHttpClient
avantreq.Content.ReadAsStringAsync()
finitions.Noter que
req.Content.ReadAsStringAsync()
est une méthode asynchrone. Vous avez besoin d'attendre pour elle de remplir avant de disposer duHttpClient
.Aussi, vous semblez être l'appel de
ReadAsStringAsync
dansreq.Content
, ne pourrait-il pas êtreresponse.Content
?Presque il n'y a pas de raison d'utiliser
ContinueWith
lorsque vous traitez avec async/await. Tout ce qui est fait par le compilateur pour vous.Qu'est-ce que l'exception maintenant? Post le stacktrace et mise à jour de votre code.
Fait. Merci pour l'aide déjà.
Dans votre code, vous êtes en attente de
req.Content
. Ne pourrait-il pas êtreresponse.Content
? trouver ma mise à jour de réponse.Aaaaaah! Qui semble avoir été le coupable. Je suis bête! Avoir quelques rep. Une grande aide!
OriginalL'auteur Sriram Sakthivel
La vraie raison de la
ObjectDisposedException
est jeté est parce que leHttpClient
dispose laContent
immédiatement après un formulaire de demande. Jetez un oeil à la docs.Donc, si vous avez besoin de lire un
Request
's de contenu, par exemple dans les tests, assurez-vous de lire avant appelSendAsync
.Content
deux fois (à la suite d'un dépassement de délai ou similaire), vous obtenez une ObjectDisposedException Pour info, il ressemble à ce qui a été corrigé dans la source de la référence: github.com/dotnet/corefx/blob/master/src/System.Net.Http/src/... (même si je suis encore de voir le même problème en utilisant le Système.Net.Http, Version=4.0.0.0)OriginalL'auteur Philip Bijker
Vous êtes accédant à la demande de Contenu, pas la Réponse.
Ce
devrait être
OriginalL'auteur Tseng