'System.Net.Http.HttpContent', 'ReadAsync' için bir tanım içermiyor ve uzantı yöntemi yok


101

Yeni yaptığım bir Web API'sini kullanmak için bir konsol uygulaması yaptım. Konsol uygulaması kodu derlenmiyor. Bana derleme hatası veriyor:

'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?)

İşte bu hatanın oluştuğu bir test yöntemi.

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

Bu yöntemi kullandım ve bir MVC istemcisinden kullandım.

Yanıtlar:


142

Uzun bir mücadeleden sonra çözümü buldum.

Çözüm: Bir referans ekleyin System.Net.Http.Formatting.dll. Bu derleme ayrıca C: \ Program Files \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Assemblies klasöründe de mevcuttur.

Yöntem ReadAsAsync, kitaplıktaki HttpContentExtensionsad alanında System.Net.Httpbulunan sınıfta bildirilen bir genişletme yöntemidir System.Net.Http.Formatting.

Reflektör kurtarmaya geldi!


7
Başkalarının varoşları sallamasına yardımcı olan kendi kendine cevaplar!
granadaCoder

O klasörü oraya nasıl getirdin? Web platformu yükleyicisini kullandım ve bu klasörü Program Dosyaları'nda oluşturmadı.
bladefist

5
Referans Ekle -> Montajlar -> Uzantılar. Listelenmemişse, Montaj Ara kutusuna gidin ve 'formatlama' yazın. Umarım bu sizin için daha kolay olur.
Franko

1
Bir güncelleme, benim burada buldum: C: \ Program Files (x86) \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Packages \ Microsoft.AspNet.WebApi.Client.4.0.30506.0 \ lib \ net40
PurpleSmurph

7
nuget.org/packages/System.Net.Http.Formatting.Extension - bunu kullanmamak için herhangi bir neden var mı?
WernerCD

96

correct NuGet packageKonsol uygulamanıza şunu yüklediğinizden emin olun :

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

ve en azından .NET 4.0'ı hedeflediğinizi.

Bu söyleniyor, GetAllFoosişleviniz bir döndürmek için tanımlanmıştır, IEnumerable<Prospect>oysa ReadAsAsyncyönteminizde geçtiğiniz IEnumerable<Foo>ve açıkça uyumlu türler değildir.

Install-Package Microsoft.AspNet.WebApi.Client

Proje yöneticisi konsolunda proje seçin


Teşekkürler. Bu bir kaymaydı, işle ilgili kodu kaldırma ve Foos ile değiştirme çabalarımdan kalan bir şeydi.
Su Soğutucu v2

Ben anlamadım Konsol uygulaması özelliklerimde zaten .NET 4.0 çerçevesini hedefliyorum. Bu kitaplığa Microsoft.AspNet.WebAPI.Client.dll için bir referans ayarlamam gerekir mi? ASP.NET MVC projesinde, Web API'mi de kullanan ve gayet iyi çalışan böyle bir başvuru asla ayarlamadım.
Water Cooler v2

5
Microsoft.AspNet.WebApi.ClientNuGet'i yüklemeniz gerekir . Bu, en son sürümü internetten indirecek ve konsol uygulamanızdaki montajı referans alacaktır. Bu tam olarak ASP.NET MVC proje şablonunun yaptığı şeydir ve çalışması için hiçbir şey yüklemenize gerek kalmamasının nedeni budur. Ancak konsol uygulamanızda böyle bir şey yok.
Darin Dimitrov

1
Teşekkürler. Dediğini yaptım Çözümümde 12 projem var, ancak garip bir nedenden ötürü, Kitaplık Paketi Yöneticisi konsolunda 'Microsoft.AspNet.WebApi.Client'i yükle' dedikten sonra, normal izini yazdırdı ve ardından 'Microsoft.AspNet başarıyla yüklendi .WebApi.Client içinde MyMVCProjectNameAndNotMyConsoleProjectName '. Bir dahaki sefere Konsol projemi seçtiğimde ve aynı şeyi paket yöneticisi konsoluna yazdım. MyMVCProjectName'in zaten Microsoft.AspNet.WebApi.Client'e başvurduğunu söyledi. Kafam karıştı.
Su Soğutucu v2

Evet ben de. Sıfırdan başlamak. Yeni konsol uygulaması, NuGet konsolunu açın Install-Package Microsoft.AspNet.WebApi.Client, kodu yazın ve deneyin.
Darin Dimitrov

21
  • ne zamandan itibaren montaj referansını bulamazsanız (Referansa sağ tıklayın -> gerekli montajı ekleyin)

Bu Paket yöneticisi konsolunu deneyin
Install-Package System.Net.Http.Formatting.Extension -Version 5.2.3 ve sonra ekleme başvurusunu kullanarak ekleyin.


3
Dotnetcore uygulamasını en son 2.2'den 3.1'e geçiriyordum ve bu hatayla karşılaştım. Uygulamam zaten System.Net.Http.Formatting.Extension v5.2.3'e başvuruyor ancak uygulamam bu hatayı şikayet ediyor, bu yüzden Microsoft.AspNet.WebApi nuget paketini yükledim Rikin ve Darin tarafından önerildiği gibi müşteri ve bu sorun çözüldükten sonra. Teşekkürler
AKS

12

System.Net.Http.Formatting.dll'ye bir başvuru eklemek, DLL uyuşmazlığı sorunlarına neden olabilir. Şu anda System.Net.Http.Formatting.dll, Newtonsoft.Json.DLL'nin 4.5.0.0 sürümüne başvuruyor gibi görünürken, en son sürüm 6.0.0.0'dır. Bu, en son Newtonsoft NuGet paketine veya DLL'ye başvurursanız, bir .NET Derlemesi istisnasını önlemek için bir bağlama yeniden yönlendirmesi eklemeniz gerektiği anlamına gelir:

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

Bu nedenle, System.Net.Http.Formatting.dll'ye bir başvuru eklemenin alternatif bir çözümü, yanıtı bir dize olarak okumak ve ardından JsonConvert.DeserializeObject (responseAsString) ile kendinizi eski haline getirmektir. Tam yöntem şöyle olacaktır:

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

veya VS 2012'niz varsa, paket yöneticisi konsoluna gidip Install-Package Microsoft.AspNet.WebApi.Client yazabilirsiniz.

Bu, paketin en son sürümünü indirir


Bu benim için düzeltti. - VS2013'ü kullanarak
Dan Rayson

Zaten bir Microsoft.AspNet.WebApi.Client paketiniz varsa, yüklemeyi kaldırmayı ve yüklemeyi deneyin; bu, v 5.2.3
Naveen

-1

Projenizde Bu Montaj Referansını KULLANIN

Add a reference to System.Net.Http.Formatting.dll

7
Ocak 2013'te kabul edilen cevap bunu zaten açıklıyor ve daha fazla bilgi içeriyor. Cevabınız da doğru şekilde biçimlendirilmemiş.
user247702
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.