Não consigo encontrar como usar o HttpContent

186

Estou tentando usar HttpContent:

HttpContent myContent = HttpContent.Create(SOME_JSON);

... mas não estou tendo sorte em encontrar a DLL onde está definida.

Primeiro, tentei adicionar referências a Microsoft.Httpe também System.Net, mas nenhuma delas está na lista. Também tentei adicionar uma referência, System.Net.Httpmas a HttpContentclasse não está disponível.

Então, alguém pode me dizer onde posso encontrar a HttpContentturma?

user1416156
fonte

Respostas:

-7

A classe é listada como presente na System.Net.Httpmontagem. Observe que essa classe é nova para o .NET 4.5, portanto, você precisa usar essa versão do BCL.

dlev
fonte
2
Ele também está disponível para o .NET 4 através do pacote Microsoft.NET.Http de NuGet
Panagiotis Kanavos
121
Odeio ser exigente, mas, dada a pergunta, essa não é a resposta competitiva? Claro que System.Net.Http contém HttpContent. Mas HttpContent não possui um método Create. Você precisará usar uma das classes derivadas ( pfelix.wordpress.com/2012/01/16/… ) como StringContent. Por exemplo, novo StringContent (SOME_JSON)
6footunder 6/06
13
@ 6footunder Isso não é exigente, esta resposta não está correta.
Aran Mulholland
Você pode ver a resposta de Youngjae abaixo para obter um bom exemplo: stackoverflow.com/a/24474664/21539
Zain Rizvi
8
Esta resposta faz endereço a intenção do OP originais questão que a partir de minha leitura cuidadosa pede única onde a HttpContentclasse pode ser encontrado. (Observe também que o OP aceitou esta resposta.) Acontece que o OP teve um segundo problema (tentando construir uma instância de HttpClient) que provavelmente não era evidente para o OP até depois que o problema de referência da DLL foi resolvido. Algumas das respostas aqui abordam esse segundo problema e muitos acharam essas respostas úteis. Finalmente, editei a pergunta (com base no texto original do OP) para esclarecê-la.
DavidRR 27/05
374

Apenas use...

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

Ou,

var stringContent = new StringContent(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync("http://www.sample.com/write", stringContent);
Youngjae
fonte
Diz que o parâmetro de conteúdo precisa ser IHttpContent e não StringContent. Quando eu o transmito para a interface, fica feliz.
Micahhoover
3
Acabou usando HttpStringContent. Não pude usar a classe StringContent porque PostAsync (ou PutAsync no meu caso) não aceita StringContent, mesmo se você a converter em um objeto IHttpContent.
Micahhoover
4
StringContent funciona para mim com PostAsync, mas se você quiser ou precisar usar HttpContent, poderá fazer o seguinte: HttpContent content = new StringContent (jsonString);
Chris Koester
Eu continuo vendo essa resposta para o que parece ser um problema semelhante ao meu, no entanto, ao depurar as duas APIs, recebo um PostAsync ("path", StringContent) para disparar, mas quando atinge a outra API, não tenho um corpo para analisar e usar e, no retorno, recebo 500 ... Estou perdido, pois parece que estou fazendo assim. A única diferença é que eu não serializo o objeto, pois ele já é serializado quando o recebo na primeira API e é uma passagem simples.
Slagmoth
Esta deve ser a resposta: /
DanielV 27/11/19
148

Para pegar o comentário do 6footunder e transformá-lo em resposta, HttpContenté abstrato, então você precisa usar uma das classes derivadas:

insira a descrição da imagem aqui

Chris S
fonte
5
Parece que ele usou o recurso "Diagrama de classe" do Visual Studio (clique com o botão direito do mouse em seu projeto, Adicionar item, Diagrama de classe. Em seguida, você pode acessar o Solution Explorer e expandir as Referências para obter diagramas de bibliotecas às quais você faz referência.) Docs.microsoft.com/en -us / visualstudio / ide /…
Arin
77

Para JSON Post:

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

Não 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/

Felipe Deveza
fonte
Estou tentando usar o exemplo "não-json", como devo ler os dados no terminal de recebimento?
Joe
var contents = aguardar response.Content.ReadAsStringAsync ();
Felipe Deveza 23/06
6

Embora a versão final do HttpContent e todo o espaço para nome System.Net.Http venha com o .NET 4.5, você pode usar uma versão do .NET 4 adicionando o pacote Microsoft.Net.Http do NuGet

Panagiotis Kanavos
fonte
0

Tenho certeza de que o código não está usando a classe System.Net.Http.HttpContent, mas o Microsoft.Http.HttpContent. O Microsoft.Http era o WCF REST Starter Kit, que nunca fazia a pré-visualização antes de ser colocado no .NET Framework. Você ainda pode encontrá-lo aqui: http://aspnet.codeplex.com/releases/view/24644

Eu não recomendaria basear um novo código nele.

RasmusW
fonte
0

O System.Net.Httpespaço para nome (onde a HttpContentclasse reside) é novo no .Net 4.5 , você está usando um VS2012 RC?

Caso contrário, você não teria acesso a isso.

EkoostikMartin
fonte