Nie można znaleźć sposobu użycia HttpContent

185

Próbuję użyć HttpContent:

HttpContent myContent = HttpContent.Create(SOME_JSON);

... ale nie mam szczęścia znaleźć biblioteki DLL, w której jest zdefiniowana.

Najpierw próbowałem dodanie odniesienia do Microsoft.Httpjak System.Net, ale nie ma na liście. Próbowałem również dodać odwołanie do, System.Net.Httpale HttpContentklasa nie jest dostępna.

Czy ktoś może mi powiedzieć, gdzie mogę znaleźć HttpContentklasę?

użytkownik 1416156
źródło

Odpowiedzi:

-7

Klasa jest wymieniona jako obecna w System.Net.Httpzestawie. Zauważ, że ta klasa jest nowa dla .NET 4.5, więc musisz używać tej wersji BCL.

dlev
źródło
2
Jest również dostępny dla platformy .NET 4 za pośrednictwem pakietu Microsoft.NET.Http firmy NuGet
Panagiotis Kanavos
121
Nienawidzisz być wybrednym, ale biorąc pod uwagę pytanie, to nie jest odpowiedź konkurencji? Sure System.Net.Http zawiera HttpContent. Ale HttpContent nie posiada metody Create. Musisz użyć jednej z klas pochodnych ( pfelix.wordpress.com/2012/01/16/… ), takich jak StringContent. Np. Nowy StringContent (SOME_JSON)
6footunder
13
@ 6footunder To wcale nie jest wybredne, ta odpowiedź jest nieprawidłowa.
Aran Mulholland
Poniżej możesz zobaczyć odpowiedź Youngjae na odpowiedni przykład: stackoverflow.com/a/24474664/21539
Zain Rizvi
8
Ta odpowiedź odnosi się do intencji pierwotnego pytania OP, które z mojej uważnej lektury dotyczy tylko tego, gdzie HttpContentmożna znaleźć klasę. (Należy również pamiętać, że PO przyjął tę odpowiedź). Tak się składa, że PO miała drugi problem (próby skonstruowania instancji HttpClient), który prawdopodobnie nie było oczywiste dla PO aż po problem został rozwiązany odniesienie DLL. Niektóre odpowiedzi tutaj rozwiązują ten drugi problem i wiele osób uznało je za przydatne. Na koniec zredagowałem pytanie (w oparciu o oryginalny tekst PO), aby je wyjaśnić.
DavidRR
373

Po prostu użyj...

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

Lub,

var stringContent = new StringContent(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync("http://www.sample.com/write", stringContent);
Youngjae
źródło
Mówi, że parametrem treści musi być IHttpContent, a nie StringContent. Kiedy jednak przesyłam go do interfejsu, jest szczęśliwy.
micahhoover
3
Skończyło się na użyciu HttpStringContent. Nie mogłem użyć klasy StringContent, ponieważ PostAsync (lub PutAsync w moim przypadku) nie akceptuje StringContent, nawet jeśli rzutujesz ją na obiekt IHttpContent.
micahhoover
4
StringContent działa dla mnie z PostAsync, ale jeśli chcesz lub musisz użyć HttpContent, możesz to zrobić w następujący sposób: HttpContent content = new StringContent (jsonString);
Chris Koester
Ciągle widzę tę odpowiedź na problem, który wydaje się podobny do mojego, jednak podczas debugowania za pomocą obu interfejsów API pojawia się PostAsync („ścieżka”, StringContent) do uruchomienia, ale gdy trafia on na inny interfejs API, nie mam ciało do przeanalizowania i użycia, a po powrocie dostaję 500 ... Jestem zagubiony, ponieważ wygląda na to, że robię to w ten sposób. Jedyną różnicą jest to, że nie serializuję obiektu, ponieważ jest on już serializowany, gdy otrzymuję go w pierwszym interfejsie API, i jest to zwykłe przejście.
Slagmoth,
To powinna być odpowiedź: /
DanielV
148

Aby wziąć komentarz 6footunder i przekształcić go w odpowiedź, HttpContentjest abstrakcyjny, więc musisz użyć jednej z pochodnych klas:

wprowadź opis zdjęcia tutaj

Chris S.
źródło
5
Wygląda na to, że użył funkcji „Diagram klas” programu Visual Studio (kliknij projekt prawym przyciskiem myszy, Dodaj element, Diagram klasy. Następnie możesz przejść do Eksploratora rozwiązań i rozwinąć Odnośniki, aby uzyskać diagramy bibliotek, do których się odwołujesz.) Docs.microsoft.com/en -us / visualstudio / ide /…
Arin
77

W przypadku JSON Post:

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

Inne niż 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
źródło
Próbuję użyć twojego przykładu „nie-json”, jak powinienem odczytać dane po stronie odbierającej?
Joe
var content = czekaj na odpowiedź.Content.ReadAsStringAsync ();
Felipe Deveza
6

Chociaż ostateczna wersja HttpContent i cała przestrzeń nazw System.Net.Http będzie dostarczana z .NET 4.5, możesz użyć wersji .NET 4, dodając pakiet Microsoft.Net.Http z NuGet

Panagiotis Kanavos
źródło
0

Jestem prawie pewien, że kod nie używa klasy System.Net.Http.HttpContent, ale zamiast tego Microsoft.Http.HttpContent. Microsoft.Http był zestawem startowym WCF REST, który nigdy nie wyświetlał podglądu przed umieszczeniem go w .NET Framework. Nadal można go znaleźć tutaj: http://aspnet.codeplex.com/releases/view/24644

Nie polecałbym oparcia na nim nowego kodu.

RasmusW
źródło
0

Przestrzeń System.Net.Httpnazw (gdzie HttpContentznajduje się klasa) jest nowa w .Net 4.5 , czy używasz VS2012 RC?

W przeciwnym razie nie miałbyś do tego dostępu.

EkoostikMartin
źródło