'System.Net.Http.HttpContent' không chứa định nghĩa cho 'ReadAsAsync' và không có phương thức mở rộng


97

Tôi đã tạo một ứng dụng bảng điều khiển để sử dụng API Web mà tôi vừa tạo. Mã ứng dụng bảng điều khiển không biên dịch. Nó cho tôi lỗi biên dịch:

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

Đây là một phương pháp kiểm tra mà lỗi này xảy ra.

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

Tôi đã sử dụng phương pháp này và sử dụng nó từ một khách hàng MVC.

Câu trả lời:


140

Sau một hồi đấu tranh, tôi đã tìm ra giải pháp.

Giải pháp: Thêm tham chiếu đến System.Net.Http.Formatting.dll. Hợp ngữ này cũng có sẵn trong thư mục C: \ Program Files \ Microsoft ASP.NET \ ASP.NET MVC 4 \ Assemblies .

Phương thức ReadAsAsyncnày là một phương thức mở rộng được khai báo trong lớp HttpContentExtensions, nằm trong không gian tên System.Net.Httptrong thư viện System.Net.Http.Formatting.

Phản xạ đến để giải cứu!


7
Câu trả lời tự giúp người khác làm rung chuyển vùng ngoại ô!
granadaCoder,

Làm thế nào bạn có được thư mục đó ở đó? Tôi đã sử dụng trình cài đặt nền tảng web và nó không tạo thư mục đó trong Tệp chương trình.
bladefist

5
Thêm Tham chiếu -> Tập hợp -> Tiện ích mở rộng. Nếu nó không được liệt kê, hãy chuyển đến hộp Cụm tìm kiếm và nhập 'định dạng'. Hy vọng rằng nó tìm thấy nó dễ dàng hơn cho bạn.
FrankO

1
Một bản cập nhật, tôi đã tìm thấy ở đây: 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 - bất kỳ lý do gì để không sử dụng cái này?
WernerCD

93

Đảm bảo rằng bạn đã cài đặt correct NuGet packageứng dụng bảng điều khiển của mình:

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

và bạn đang nhắm mục tiêu ít nhất là .NET 4.0.

Điều này đang được nói, GetAllFooshàm của bạn được định nghĩa để trả về một IEnumerable<Prospect>trong khi trong ReadAsAsyncphương thức của bạn mà bạn đang truyền IEnumerable<Foo>rõ ràng là các kiểu không tương thích.

Install-Package Microsoft.AspNet.WebApi.Client

Chọn dự án trong bảng điều khiển trình quản lý dự án


Cảm ơn. Đó là một lỗi, một phần còn sót lại từ nỗ lực của tôi để xóa mã liên quan đến doanh nghiệp và thay thế nó bằng Foos.
Water Cooler v2

Tôi không hiểu. Tôi đã nhắm mục tiêu khung .NET 4.0 trong các thuộc tính ứng dụng Console của mình. Tôi có cần đặt tham chiếu tới thư viện này Microsoft.AspNet.WebAPI.Client.dll không? Tôi chưa bao giờ đặt bất kỳ tham chiếu nào như vậy trong dự án ASP.NET MVC cũng sử dụng API Web của tôi và hoạt động tốt.
Water Cooler v2

5
Bạn cần cài đặt Microsoft.AspNet.WebApi.ClientNuGet. Thao tác này sẽ tải xuống phiên bản mới nhất từ ​​internet và tham chiếu lắp ráp trong ứng dụng bảng điều khiển của bạn. Đó chính xác là những gì mẫu dự án ASP.NET MVC làm và là lý do tại sao bạn không cần cài đặt bất cứ thứ gì để nó hoạt động. Nhưng trong ứng dụng console của bạn không có thứ đó.
Darin Dimitrov

1
Cảm ơn. Tôi đã làm những gì bạn nói. Tôi có 12 dự án trong giải pháp của mình, nhưng vì một số lý do kỳ lạ, sau khi tôi nói 'cài đặt gói Microsoft.AspNet.WebApi.Client' trong bảng điều khiển Trình quản lý gói thư viện, nó đã in dấu vết thông thường và sau đó nói 'Đã cài đặt thành công Microsoft.AspNet .WebApi.Client trong MyMVCProjectNameAndNotMyConsoleProjectName '. Lần tiếp theo tôi đã chọn dự án Console của mình và nhập điều tương tự vào bảng điều khiển trình quản lý gói. Nó cho biết MyMVCProjectName đã tham chiếu đến Microsoft.AspNet.WebApi.Client. Tôi bị bối rối.
Water Cooler v2

Vâng, tôi cũng vậy. Bắt đầu từ đầu. Ứng dụng bảng điều khiển mới, mở bảng điều khiển NuGet, nhập Install-Package Microsoft.AspNet.WebApi.Clientvà thử mã.
Darin Dimitrov

20
  • nếu bạn không thể tìm thấy tham chiếu lắp ráp từ khi nào (Nhấp chuột phải vào tham chiếu -> thêm lắp ráp cần thiết)

hãy thử bảng điều khiển trình quản lý gói này
Install-Package System.Net.Http.Formatting.Extension -Version 5.2.3 và sau đó thêm bằng cách sử dụng thêm tham chiếu.


2
Tôi đang di chuyển ứng dụng dotnetcore từ 2.2 sang 3.1 mới nhất và gặp phải lỗi này. Ứng dụng của tôi đã có tham chiếu đến System.Net.Http.Formatting.Extension v5.2.3 nhưng ứng dụng của tôi phàn nàn lỗi này, vì vậy tôi đã cài đặt gói nuget Microsoft.AspNet.WebApi .Lient theo gợi ý của Rikin và Darin và sau khi vấn đề đó được giải quyết. Cảm ơn
AKS

12

Việc thêm tham chiếu vào System.Net.Http.Formatting.dll có thể gây ra sự cố không khớp DLL. Ngay bây giờ, System.Net.Http.Formatting.dll dường như tham chiếu đến phiên bản 4.5.0.0 của Newtonsoft.Json.DLL, trong khi phiên bản mới nhất là 6.0.0.0. Điều đó có nghĩa là bạn cũng sẽ cần thêm một chuyển hướng ràng buộc để tránh ngoại lệ .NET Assembly nếu bạn tham khảo gói Newtonsoft NuGet hoặc DLL mới nhất:

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

Vì vậy, một giải pháp thay thế để thêm một tham chiếu vào System.Net.Http.Formatting.dll là đọc phản hồi dưới dạng một chuỗi và sau đó tự phân quyền với JsonConvert.DeserializeObject (responseAsString). Phương thức đầy đủ sẽ là:

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

hoặc nếu bạn có VS 2012, bạn có thể truy cập bảng điều khiển trình quản lý gói và nhập Install-Package Microsoft.AspNet.WebApi.Client

Điều này sẽ tải xuống phiên bản mới nhất của gói


CÁi này đã sửa nó giúp tôi. - sử dụng VS2013
Dan Rayson

nếu bạn đã có gói Microsoft.AspNet.WebApi.Client, hãy thử gỡ cài đặt và cài đặt nó, cách đó đã khắc phục sự cố của tôi cho v 5.2.3
Naveen

-1

SỬ DỤNG Lời giới thiệu lắp ráp này trong dự án của bạn

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

6
Câu trả lời được chấp nhận từ tháng 1 năm 2013 đã giải thích điều này và có thêm thông tin. Câu trả lời của bạn cũng không được định dạng đúng.
user247702
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.