Content-Header
может отсутствовать в ответе. Если вы проверите HttpWebResponse.ContentLength , вы получите -1
. Как объясняют документы:
Если заголовок Content-Length не установлен в ответе, ContentLength устанавливается в значение -1.
HttpWebRequest и HttpWebResponse действительно старые классы, которые в значительной степени заменены HttpClient, особенно in. NET Core. При создании этих классов не было типов значений, допускающих обнуляемость, поэтому они могут возвращать только -1
.
. Все это следует заменить на HttpClient. Код не просто проще, сам класс является поточно-ориентированным и может быть использован повторно. Он кеширует сокетов, что означает, что приложению не нужно платить налог на разрешение DNS каждый раз, когда оно пытается вызвать одну и ту же конечную точку:
var data=new { adresses = new [] { "nairobi", "nakuru", "kericho" }};
var postData = JsonConvert.SerializeObject(data);
var content=new StringContent(data,Encoding.UTF8,"application/json");
var response=await client.PostAsync(content);
На этом этапе вы можете проверить код состояния:
if (response.StatusCode == ...) // Check status code here.
{
...
}
Content-Length
является заголовком Content . Может отсутствовать, и в этом случае свойство ContentLength
будет иметь значение null:
if (response.Content.Headers.ContentLength!=null)
{
long length=response.Content.Headers.ContentLength.Value;
//Use the Content length here
}
Или, используя сопоставление с образцом:
if (response.Content.Headers.ContentLength is long length)
{
//Use the Content length here
}
Наконец, вы можете прочитать ответ как строка с ReadAsStringAsync
и десериализация. Этот метод позаботится о декодировании тела ответа:
var json=await response.Content.ReadAsStringAsync();
var models=JsonConvert.DeserializeObject<List<LocationModel>>(json);