Non riesco a trovare come usare HttpContent


186

Sto cercando di usare HttpContent:

HttpContent myContent = HttpContent.Create(SOME_JSON);

... ma non ho avuto fortuna a trovare la DLL in cui è definita.

In primo luogo, ho provato ad aggiungere i riferimenti a Microsoft.Httpcome pure System.Net, ma non è nella lista. Ho anche provato ad aggiungere un riferimento System.Net.Httpma la HttpContentclasse non è disponibile.

Quindi, qualcuno può dirmi dove posso trovare la HttpContentlezione?

Risposte:


-7

La classe è elencato come presente nel System.Net.Httpcomplesso. Si noti che questa classe è nuova per .NET 4.5, quindi è necessario utilizzare quella versione di BCL.


2
È anche disponibile per .NET 4 tramite il pacchetto Microsoft.NET.Http da NuGet
Panagiotis Kanavos,

121
Odio essere pignoli ma data la domanda, questa non è la risposta competitiva? Sicuro System.Net.Http contiene HttpContent. Ma HttpContent non possiede un metodo Create. Dovrai usare una delle classi derivate ( pfelix.wordpress.com/2012/01/16/… ) come StringContent. Ad esempio, il nuovo StringContent (SOME_JSON)
footunder

13
@ 6footunder Non è affatto schizzinoso, questa risposta non è corretta.
Aran Mulholland,

Di seguito puoi vedere la risposta di Youngjae per un esempio corretto: stackoverflow.com/a/24474664/21539
Zain Rizvi

8
Questa risposta fa indirizzo l'intento del PO originale questione che dalla mia lettura attenta chiede solo dove la HttpContentclasse può essere trovato. (Si noti inoltre che l'OP ha accettato questa risposta.) È proprio così che l'OP ha avuto un secondo problema (tentando di costruire un'istanza di HttpClient) che probabilmente non era evidente all'OP fino a quando il problema di riferimento DLL non è stato risolto. Alcune delle risposte qui affrontano quel secondo problema e molte hanno trovato utili quelle risposte. Infine, ho modificato la domanda (sulla base del testo originale del PO) per chiarirla.
DavidRR,

374

Usa solo ...

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

O,

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

Dice che il parametro content deve essere IHttpContent e non StringContent. Quando lo lancio all'interfaccia è comunque felice.
micahhoover,

3
Finito con HttpStringContent. Non ho potuto usare la classe StringContent perché PostAsync (o PutAsync nel mio caso) non accetta StringContent anche se lo si lancia su un oggetto IHttpContent.
micahhoover,

4
StringContent funziona per me con PostAsync, ma se si desidera o è necessario utilizzare HttpContent, è possibile farlo in questo modo: HttpContent content = new StringContent (jsonString);
Chris Koester,

Continuo a vedere questa risposta a quello che sembra essere un problema simile al mio, tuttavia mentre eseguo il debug attraverso entrambe le mie API, ottengo un PostAsync ("percorso", StringContent) che viene attivato ma quando colpisce l'altra API non lo faccio ho un corpo da analizzare e usare e al ritorno ottengo un 500 ... Sono in perdita perché sembra che lo stia facendo in questo modo. L'unica differenza è che non serializzo l'oggetto in quanto è già serializzato quando lo ricevo nella prima API ed è un passthrough semplice.
Slagmoth,

Questa dovrebbe essere la risposta: /
DanielV,

148

Per prendere il commento di 6footunder e trasformarlo in una risposta, HttpContentè astratto, quindi è necessario utilizzare una delle classi derivate:

inserisci qui la descrizione dell'immagine


5
Sembra che abbia usato la funzione "Diagramma di classe" di Visual Studio (fare clic con il pulsante destro del mouse sul progetto, Aggiungi elemento, Diagramma di classe. Quindi è possibile passare a Esplora soluzioni ed espandere Riferimenti per ottenere diagrammi di librerie a cui si fa riferimento.) Docs.microsoft.com/en -us / visualstudio / ide /…
Arin,

77

Per 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/


Sto cercando di usare il tuo esempio "non json", come devo leggere i dati sull'estremità ricevente?
Joe,

var contents = await response.Content.ReadAsStringAsync ();
Felipe Deveza,

6

Mentre la versione finale di HttpContent e l'intero spazio dei nomi System.Net.Http arriveranno con .NET 4.5, è possibile utilizzare una versione .NET 4 aggiungendo il pacchetto Microsoft.Net.Http da NuGet


0

Sono abbastanza sicuro che il codice non stia utilizzando la classe System.Net.Http.HttpContent, ma invece Microsoft.Http.HttpContent. Microsoft.Http era lo Starter Kit REST WCF, che non ha mai realizzato l'anteprima prima di essere inserito in .NET Framework. Puoi ancora trovarlo qui: http://aspnet.codeplex.com/releases/view/24644

Non consiglierei di basare un nuovo codice su di esso.


0

Lo System.Net.Httpspazio dei nomi (dove HttpContentrisiede la classe) è nuovo in .Net 4.5 , stai usando un VS2012 RC?

Altrimenti, non avresti accesso a questo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.