'System.Net.Http.HttpContent' tidak berisi definisi untuk 'ReadAsAsync' dan tidak ada metode ekstensi

98

Saya membuat aplikasi konsol untuk menggunakan API Web yang baru saja saya buat. Kode aplikasi konsol tidak dikompilasi. Ini memberi saya kesalahan kompilasi:

'System.Net.Http.HttpContent' does not contain a definition for 
'ReadAsAsync' and no extension method 'ReadAsAsync' accepting a 
first argument of type 'System.Net.Http.HttpContent' could be 
found (are you missing a using directive or an assembly reference?)

Berikut adalah metode pengujian di mana kesalahan ini terjadi.

static IEnumerable<Foo> GetAllFoos()
{
  using (HttpClient client = new HttpClient())
  {
    client.DefaultRequestHeaders.Add("appkey", "myapp_key");

    var response = client.GetAsync("http://localhost:57163/api/foo").Result;

    if (response.IsSuccessStatusCode)
      return response.Content.ReadAsAsync<IEnumerable<Foo>>().Result.ToList();
  }

  return null;
}

Saya telah menggunakan metode ini dan mengkonsumsinya dari klien MVC.

Pendingin Air v2.0
sumber

Jawaban:

140

Setelah perjuangan panjang, saya menemukan solusinya.

Solusi: Tambahkan referensi ke System.Net.Http.Formatting.dll. Rakitan ini juga tersedia di folder C: \ Program Files \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Assemblies .

Metode tersebut ReadAsAsyncadalah metode ekstensi yang dideklarasikan di kelas HttpContentExtensions, yang ada di namespace System.Net.Httpdi perpustakaan System.Net.Http.Formatting.

Reflektor datang untuk menyelamatkan!

Pendingin Air v2.0
sumber
7
Jawaban diri yang membantu orang lain mengguncang pinggiran kota!
granadaCoder
Bagaimana Anda bisa mendapatkan folder itu di sana? Saya menggunakan penginstal platform web dan tidak membuat folder itu di Program Files.
Bladefist
5
Tambahkan Referensi -> Sidang -> Ekstensi. Jika tidak terdaftar, masuk ke kotak Search Assemblies dan ketik 'formatting'. Semoga lebih mudah bagi Anda.
FrankO
1
Pembaruan, saya menemukan milik saya di sini: C: \ Program Files (x86) \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Packages \ Microsoft.AspNet.WebApi.Client.4.0.30506.0 \ lib \ net40
PurpleSmurph
6
nuget.org/packages/System.Net.Http.Formatting.Extension - ada alasan untuk tidak menggunakan ini?
WernerCD
94

Pastikan Anda telah menginstal correct NuGet packageaplikasi konsol Anda:

<package id="Microsoft.AspNet.WebApi.Client" version="4.0.20710.0" />

dan Anda menargetkan setidaknya .NET 4.0.

Ini dikatakan, GetAllFoosfungsi Anda didefinisikan untuk mengembalikan IEnumerable<Prospect>sedangkan dalam ReadAsAsyncmetode Anda, Anda meneruskan IEnumerable<Foo>yang jelas bukan tipe yang kompatibel.

Install-Package Microsoft.AspNet.WebApi.Client

Pilih proyek di konsol manajer proyek

Darin Dimitrov
sumber
Terima kasih. Itu adalah kesalahan, sisa dari usaha saya untuk menghapus kode terkait bisnis dan menggantinya dengan Foos.
Water Cooler v2
Saya tidak mengerti. Saya sudah menargetkan kerangka kerja .NET 4.0 di properti aplikasi Konsol saya. Apakah saya perlu menetapkan referensi ke perpustakaan ini Microsoft.AspNet.WebAPI.Client.dll? Saya tidak pernah menetapkan referensi seperti itu dalam proyek ASP.NET MVC yang juga menggunakan API Web saya dan berfungsi dengan baik.
Water Cooler v2
5
Anda perlu menginstal Microsoft.AspNet.WebApi.ClientNuGet. Ini akan mengunduh versi terbaru dari internet dan mereferensikan perakitan di aplikasi konsol Anda. Itulah yang dilakukan template proyek ASP.NET MVC dan merupakan alasan mengapa Anda tidak perlu menginstal apa pun agar dapat berfungsi. Tetapi dalam aplikasi konsol Anda tidak ada hal seperti itu.
Darin Dimitrov
1
Terima kasih. Saya melakukan apa yang Anda katakan. Saya memiliki 12 proyek dalam solusi saya, tetapi untuk beberapa alasan aneh, setelah saya mengatakan 'install-package Microsoft.AspNet.WebApi.Client' di konsol Library Package Manager, itu mencetak jejak yang biasa dan kemudian berkata 'Berhasil menginstal Microsoft.AspNet .WebApi.Client di MyMVCProjectNameAndNotMyConsoleProjectName '. Lain kali saya memilih proyek Konsol saya dan mengetik hal yang sama di konsol manajer paket. Dikatakan MyMVCProjectName sudah mereferensikan Microsoft.AspNet.WebApi.Client. Saya bingung.
Water Cooler v2
Ya saya juga. Mulai dari awal. Aplikasi konsol baru, buka konsol NuGet, ketik Install-Package Microsoft.AspNet.WebApi.Clientdan coba kodenya.
Darin Dimitrov
21
  • jika Anda tidak dapat menemukan referensi perakitan sejak (klik kanan pada referensi -> tambahkan perakitan yang diperlukan)

coba Instal-Package System.Net.Http.Formatting.Extension -Version 5.2.3 konsol
Package manager ini dan kemudian tambahkan dengan menggunakan add reference.

Ganganath Rathnasekara
sumber
2
Saya sedang memigrasi aplikasi dotnetcore dari 2.2 ke 3.1 terbaru dan mengalami kesalahan ini. Aplikasi saya sudah memiliki referensi ke System.Net.Http.Formatting.Extension v5.2.3 tetapi aplikasi saya mengeluh kesalahan ini, jadi saya menginstal paket nuget Microsoft.AspNet.WebApi .Klien seperti yang disarankan oleh Rikin dan Darin dan setelah itu masalah diselesaikan. Terima kasih
AKS
12

Menambahkan referensi ke System.Net.Http.Formatting.dll dapat menyebabkan masalah ketidakcocokan DLL. Saat ini, System.Net.Http.Formatting.dll tampaknya mereferensikan Newtonsoft.Json.DLL versi 4.5.0.0, sedangkan versi terbaru adalah 6.0.0.0. Itu berarti Anda juga harus menambahkan pengalihan binding untuk menghindari pengecualian Majelis .NET jika Anda mereferensikan paket atau DLL Newtonsoft NuGet terbaru:

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
 </dependentAssembly> 

Jadi solusi alternatif untuk menambahkan referensi ke System.Net.Http.Formatting.dll adalah membaca respons sebagai string dan kemudian desearalize diri Anda dengan JsonConvert.DeserializeObject (responseAsString). Metode lengkapnya adalah:

public async Task<T> GetHttpResponseContentAsType(string baseUrl, string subUrl)
{
     using (var client = new HttpClient())
     {
         client.BaseAddress = new Uri(baseUrl);
         client.DefaultRequestHeaders.Accept.Clear();
         client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

         HttpResponseMessage response = await client.GetAsync(subUrl);
         response.EnsureSuccessStatusCode();
         var responseAsString = await response.Content.ReadAsStringAsync();
         var responseAsConcreteType = JsonConvert.DeserializeObject<T>(responseAsString);
         return responseAsConcreteType;
      }
}
Conor Kelly
sumber
9

atau jika Anda memiliki VS 2012 Anda dapat pergi ke konsol manajer paket dan ketik Install-Package Microsoft.AspNet.WebApi.Client

Ini akan mengunduh versi terbaru dari paket tersebut

Ram
sumber
Ini memperbaikinya untuk saya. - menggunakan VS2013
Dan Rayson
jika Anda sudah memiliki paket Microsoft.AspNet.WebApi.Client coba hapus instalasi dan instal, itu memperbaiki masalah saya untuk v 5.2.3
Naveen
-1

GUNAKAN Referensi Majelis ini dalam Proyek Anda

Add a reference to System.Net.Http.Formatting.dll
Debendra Dash
sumber
6
Jawaban yang diterima dari Januari 2013 sudah menjelaskan hal ini dan memiliki lebih banyak informasi. Jawaban Anda juga tidak diformat dengan benar.
pengguna247702