Ich ziehe die HttpResponseMessage über using
verfügen, wie es entsorgt werden kann. Ich bevorzuge es auch, mich nicht auf die Ausnahmebehandlung zu verlassen, um mit fehlgeschlagenen Anfragen fertig zu werden. Stattdessen bevorzuge ich es, den booleschen Wert IsSuccessStatusCode
zu überprüfen und entsprechend vorzugehen. Zum Beispiel:
using(HttpClient client = new HttpClient())
{
using(var response = await client.GetAsync("http://httpbin.org/get", HttpCompletionOption.ResponseHeadersRead))
{
if(response.IsSuccessStatusCode)
{
using (var stream = await response.Content.ReadAsStreamAsync())
using (var streamReader = new StreamReader(stream))
using (var jsonReader = new JsonTextReader(streamReader))
{
var serializer = new JsonSerializer();
//do some deserializing http://www.newtonsoft.com/json/help/html/Performance.htm
}
}
else {
//do your error logging and/or retry logic
}
}
}
EDIT: Wenn Sie tun Arbeit mit einer Rate begrenzt api die HEAD-Anforderung ist einfach nicht manchmal möglich zu senden. Als solches hier ein Codebeispiel der Art und Weise ‚die gute ol mit HttpWebRequest
(beachten Sie, dass es keinen besseren Weg, um mit http Fehler als WebException
in diesem Fall): definitiv
var req = WebRequest.CreateHttp("http://httpbin.org/get");
/*
* execute
*/
try
{
using (var resp = await req.GetResponseAsync())
{
using (var s = resp.GetResponseStream())
using (var sr = new StreamReader(s))
using (var j = new JsonTextReader(sr))
{
var serializer = new JsonSerializer();
//do some deserializing http://www.newtonsoft.com/json/help/html/Performance.htm
}
}
}
catch (WebException ex)
{
using (HttpWebResponse response = (HttpWebResponse)ex.Response)
{
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
string respStr = sr.ReadToEnd();
int statusCode = (int)response.StatusCode;
//do your status code logic here
}
}
}
Mit' HttpCompletionOption' ist der beabsichtigte Weg, um das zu erreichen, was Sie wollten. –