Не могу найти как использовать HttpContent


186

Я пытаюсь использовать HttpContent:

HttpContent myContent = HttpContent.Create(SOME_JSON);

... но мне не повезло найти DLL, где она определена.

Сначала я попытался добавить ссылки на, Microsoft.Httpа также System.Net, но ни один не в списке. Я также попытался добавить ссылку на, System.Net.Httpно HttpContentкласс недоступен.

Итак, кто-нибудь может сказать мне, где я могу найти HttpContentкласс?

Ответы:


-7

Класс указан как присутствующий в System.Net.Httpсборке. Обратите внимание, что этот класс является новым для .NET 4.5, поэтому вам необходимо использовать эту версию BCL.


2
Он также доступен для .NET 4 через пакет Microsoft.NET.Http от NuGet
Panagiotis Kanavos

121
Ненавижу быть разборчивым, но, учитывая вопрос, это не полный ответ? Конечно, System.Net.Http содержит HttpContent. Но HttpContent не обладает методом Create. Вам нужно будет использовать один из производных классов ( pfelix.wordpress.com/2012/01/16/… ), например StringContent. Например , новый StringContent (SOME_JSON)
6footunder

13
@ 6footunder Это совсем не придирчиво, этот ответ неверен.
Аран Малхолланд

Вы можете увидеть ответ Youngjae ниже для правильного примера: stackoverflow.com/a/24474664/21539
Zain Rizvi

8
Этот ответ делает адрес по намерению ФПА в первоначальном вопросе , который от моего внимательного чтения требующего только когда HttpContentкласс может быть найден. (Заметим также , что ОП принял этот ответ.) Просто так получилось , что ОП была вторая задача (пытается построить экземпляр HttpClient) , который , вероятно , не было очевидно , ОП , пока после того, как ссылка DLL проблема была решена. Некоторые из ответов здесь решают эту вторую проблему, и многие находят эти ответы полезными. Наконец, я отредактировал вопрос (основываясь на оригинальном тексте ФП), чтобы прояснить его.
DavidRR

374

Просто используйте ...

var stringContent = new StringContent(jObject.ToString());
var response = await httpClient.PostAsync("http://www.sample.com/write", stringContent);

Или,

var stringContent = new StringContent(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync("http://www.sample.com/write", stringContent);

Говорит, что параметр содержимого должен быть IHttpContent, а не StringContent. Когда я приводил его к интерфейсу, он был счастлив.
micahhoover

3
Завершается использованием HttpStringContent. Я не мог использовать класс StringContent, потому что PostAsync (или PutAsync в моем случае) не принимает StringContent, даже если вы приведете его к объекту IHttpContent.
micahhoover

4
StringContent работает для меня с PostAsync, но если вы хотите или должны использовать HttpContent, вы можете сделать это следующим образом: HttpContent content = new StringContent (jsonString);
Крис Кестер

Я продолжаю видеть этот ответ на проблему, похожую на мою, однако, когда я отлаживаю через оба моих API, я запускаю PostAsync ("путь", StringContent), но когда он сталкивается с другим API, я не есть тело для разбора и использования, и по возвращении я получаю 500 ... Я в растерянности, как мне кажется, я делаю это именно так. Разница лишь в том, что я не сериализую объект, поскольку он уже сериализован, когда я получаю его в первом API, и это простое прохождение.
Слагмот

Это должен быть ответ: /
DanielV

148

Чтобы взять комментарий 6footunder и превратить его в ответ, HttpContentявляется абстрактным, поэтому вам нужно использовать один из производных классов:

введите описание изображения здесь


5
Похоже, он использовал функцию «Диаграмма классов» в Visual Studio (щелкните правой кнопкой мыши свой проект, Добавить элемент, Диаграмма классов. Затем вы можете пройти через Обозреватель решений и развернуть Ссылки, чтобы получить схемы библиотек, на которые вы ссылаетесь.) Docs.microsoft.com/en -us / visualstudio / ide /…
Арин

77

Для JSON Post:

var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync("http://www.sample.com/write", stringContent);

Non-JSON:

var stringContent = new FormUrlEncodedContent(new[]
{
    new KeyValuePair<string, string>("field1", "value1"),
    new KeyValuePair<string, string>("field2", "value2"),
});
var response = await httpClient.PostAsync("http://www.sample.com/write", stringContent);

https://blog.pedrofelix.org/2012/01/16/the-new-system-net-http-classes-message-content/


Я пытаюсь использовать ваш пример "не-json", как мне прочитать данные на принимающей стороне?
Джо

var contents = await response.Content.ReadAsStringAsync ();
Фелипе Девеза


0

Я уверен, что в коде используется не класс System.Net.Http.HttpContent, а вместо этого Microsoft.Http.HttpContent. Microsoft.Http был начальным набором WCF REST, который никогда не создавал предварительный просмотр до помещения в .NET Framework. Вы все еще можете найти его здесь: http://aspnet.codeplex.com/releases/view/24644

Я не рекомендовал бы основывать новый код на этом.


0

Пространство System.Net.Httpимен (где HttpContentнаходится класс) является новым для .Net 4.5 , вы используете VS2012 RC?

В противном случае у вас не было бы доступа к этому.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.