'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.

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!


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


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.


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

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


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

6
Jawaban yang diterima dari Januari 2013 sudah menjelaskan hal ini dan memiliki lebih banyak informasi. Jawaban Anda juga tidak diformat dengan benar.
pengguna247702
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.