Di mana HttpContent.ReadAsAsync?

283

Saya melihat dalam banyak contoh di web menggunakan HttpClientobjek baru (sebagai bagian dari API Web baru) bahwa harus ada HttpContent.ReadAsAsync<T>metode. Namun, MSDN tidak menyebutkan metode ini, IntelliSense juga tidak menemukannya.

Kemana perginya, dan bagaimana saya mengatasinya?

David Pfeffer
sumber

Jawaban:

436

Sepertinya ini adalah metode ekstensi (dalam System.Net.Http.Formatting):

Kelas HttpContentExtensions

Memperbarui:

PM> instal-paket Microsoft.AspNet.WebApi.Client

Menurut halaman paket System.Net.Http.Formatting NuGet, System.Net.Http.Formattingpaket tersebut sekarang merupakan warisan dan sebagai gantinya dapat ditemukan dalam Microsoft.AspNet.WebApi.Clientpaket yang tersedia di NuGet di sini .

J ...
sumber
Apakah ini sudah usang di klien terbaru Nugets? Tidak dapat menemukannya sekarang (dulu bisa).
georgios
Itu bisa saja. .NET4.5 menambahkan banyak hal baru sehubungan dengan async / tugas (tunggu, dll), jadi ekstensi ini mungkin tidak lagi diperlukan. Saya mungkin akan melihat di sini, misalnya: msdn.microsoft.com/en-us/library/…
J ...
4
@georgiosd Saya baru saja memperbarui jawabannya. Sementara itu System.Net.Http.Formattingsepertinya dipindahkan ke nuget.org/packages/Microsoft.AspNet.WebApi.Client package.
Joseph Woodward
1
Jadi benarkah metode dalam pertanyaan awal HttpContent.ReadAsAsync<T>,, bukan di Microsoft.AspNet.WebApi.Client? Apa pengganti yang disarankan?
Patrick Szalapski
1
@JatatKinports Cukup yakin tidak. Paket WebAPI.Client membutuhkan .NET 4.5. Saya pikir HttpContentExtensions lama adalah untuk .NET 4.0
J ...
68

Saya memiliki masalah yang sama, jadi saya hanya mendapatkan string JSON dan deserialize ke kelas saya:

HttpResponseMessage response = await client.GetAsync("Products");
//get data as Json string 
string data = await response.Content.ReadAsStringAsync();
//use JavaScriptSerializer from System.Web.Script.Serialization
JavaScriptSerializer JSserializer = new JavaScriptSerializer();
//deserialize to your class
products = JSserializer.Deserialize<List<Product>>(data);
rosta
sumber
8
Terlepas dari kenyataan bahwa ini tidak menjawab pertanyaan, mengapa ini ditolak? Bukankah itu alternatif yang masuk akal ReadAsAsync?
Jess
7
Pastilah itu! +1!
Mrchief
7
mungkin karena Anda tidak menjawab pertanyaan kemana metode ekstensi pergi. Menulis sendiri adalah solusi buruk
Pengembang Inggris
13
Ini tidak selalu merupakan solusi yang buruk, ini dilokalkan dan karenanya tidak mungkin rusak dalam pembaruan nuget di masa depan dll. Saya siap untuk itu.
menggulung
3
Ini mengasumsikan respons memiliki tipe konten JSON.
CodeCaster
30

Jika Anda sudah menggunakan Newtonsoft.Jsondan tidak ingin menginstal Microsoft.AspNet.WebApi.Client:

 var myInstance = JsonConvert.DeserializeObject<MyClass>(
   await response.Content.ReadAsStringAsync());
Martin Brandl
sumber
9

Anda dapat menulis metode ekstensi:

public static async Task<Tout> ReadAsAsync<Tout>(this System.Net.Http.HttpContent content) {
    return Newtonsoft.Json.JsonConvert.DeserializeObject<Tout>(await content.ReadAsStringAsync());
}
Vasya Milovidov
sumber
Itulah yang akhirnya saya lakukan - saya tidak akan menyeret seluruh DLL untuk metode 2-line.
Liz
5

Cukup klik kanan di proyek Anda, pergi Kelola Paket NuGet mencari Microsoft.AspNet.WebApi.Client menginstalnya dan Anda akan memiliki akses ke metode ekstensi.

Ivan Carmenates García
sumber
3
Siapa yang mengeluh tentang apa?
David Pfeffer
0

Setelah klik ini beberapa kali dan mengikuti banyak saran, jika Anda tidak menemukannya tersedia setelah menginstal NuGet Microsoft.AspNet.WebApi.Client secara manual menambahkan referensi dari folder paket dalam solusi untuk:

\Microsoft.AspNet.WebApi.Client.5.2.6\lib\net45\System.Net.Http.Formatting.dll

Dan jangan masuk perangkap menambahkan referensi yang lebih tua ke System.Net.Http.Formatting.dll NuGet

Tom John
sumber