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

186

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

HttpContent myContent = HttpContent.Create(SOME_JSON);

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

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

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

user1416156
источник

Ответы:

-7

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

dlev
источник
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);
Youngjae
источник
Говорит, что параметр содержимого должен быть 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 ();
Фелипе Девеза
6

Хотя окончательная версия HttpContent и все пространство имен System.Net.Http будут поставляться с .NET 4.5, вы можете использовать версию .NET 4, добавив пакет Microsoft.Net.Http из NuGet.

Панагиотис Канавос
источник
0

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

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

RasmusW
источник
0

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

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

EkoostikMartin
источник