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ę?

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.


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);

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


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/


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


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.