'System.Net.Http.HttpContent' ไม่มีคำจำกัดความสำหรับ 'ReadAsAsync' และไม่มีวิธีการขยาย


101

ฉันสร้างแอปคอนโซลเพื่อใช้ Web API ที่เพิ่งสร้างขึ้น โค้ดแอปคอนโซลไม่คอมไพล์ มันทำให้ฉันมีข้อผิดพลาดในการคอมไพล์:

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

นี่คือวิธีทดสอบที่เกิดข้อผิดพลาดนี้

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

ฉันใช้วิธีนี้และใช้งานจากไคลเอนต์ MVC

คำตอบ:


142

หลังจากต่อสู้มานานฉันก็พบทางออก

วิธีแก้ไข:เพิ่มการอ้างอิงถึงSystem.Net.Http.Formatting.dll. นี้การชุมนุมยังมีอยู่ในC: \ Program Files \ Microsoft ASP.NET \ ASP.NET MVC 4 \ ประกอบโฟลเดอร์

วิธีการReadAsAsyncเป็นวิธีการขยายการประกาศในชั้นเรียนHttpContentExtensionsซึ่งอยู่ในการ namespace ในห้องสมุดSystem.Net.HttpSystem.Net.Http.Formatting

รีเฟลกเตอร์มาช่วย!


7
คำตอบของตนเองที่ช่วยให้คนอื่น ๆ ได้สัมผัสกับชานเมือง
granadaCoder

คุณได้โฟลเดอร์นั้นมาที่นั่นได้อย่างไร? ฉันใช้โปรแกรมติดตั้งแพลตฟอร์มเว็บและมันไม่ได้สร้างโฟลเดอร์นั้นใน Program Files
bladefist

5
เพิ่มการอ้างอิง -> แอสเซมบลี -> ส่วนขยาย หากไม่มีอยู่ในรายการให้ไปที่ช่อง Search Assemblies และพิมพ์ 'formatting' หวังว่าจะพบว่ามันง่ายขึ้นสำหรับคุณ
FrankO

1
การอัปเดตฉันพบของฉันที่นี่: 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 - มีเหตุผลใดที่จะไม่ใช้สิ่งนี้?
WernerCD

96

ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งcorrect NuGet packageแอปพลิเคชันในคอนโซลของคุณแล้ว:

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

และคุณกำลังกำหนดเป้าหมายอย่างน้อย. NET 4.0

ดังที่กล่าวไว้GetAllFoosฟังก์ชันของคุณถูกกำหนดให้ส่งคืนIEnumerable<Prospect>ในขณะที่ReadAsAsyncวิธีการของคุณที่คุณกำลังส่งผ่านIEnumerable<Foo>ซึ่งเห็นได้ชัดว่าไม่ใช่ประเภทที่เข้ากันได้

Install-Package Microsoft.AspNet.WebApi.Client

เลือกโครงการในคอนโซลผู้จัดการโครงการ


ขอบคุณ. นั่นเป็นเพียงสลิปที่เหลือจากความพยายามของฉันในการลบรหัสที่เกี่ยวข้องกับธุรกิจและแทนที่ด้วย Foos
Water Cooler v2

ฉันไม่เข้าใจ. ฉันกำหนดเป้าหมายกรอบงาน. NET 4.0 ในคุณสมบัติแอปคอนโซลของฉันแล้ว ฉันต้องตั้งค่าการอ้างอิงไปยังไลบรารี Microsoft.AspNet.WebAPI.Client.dll หรือไม่ ฉันไม่เคยตั้งค่าการอ้างอิงใด ๆ ในโครงการ ASP.NET MVC ที่ใช้ Web API ของฉันและใช้งานได้ดี
Water Cooler v2

5
คุณต้องติดตั้งMicrosoft.AspNet.WebApi.ClientNuGet การดำเนินการนี้จะดาวน์โหลดเวอร์ชันล่าสุดจากอินเทอร์เน็ตและอ้างอิงแอสเซมบลีในแอปพลิเคชันคอนโซลของคุณ นั่นคือสิ่งที่เทมเพลตโครงการ ASP.NET MVC ทำและเป็นเหตุผลว่าทำไมคุณไม่จำเป็นต้องติดตั้งอะไรเพื่อให้มันทำงานได้ แต่ในแอปพลิเคชันคอนโซลของคุณไม่มีสิ่งนั้น
Darin Dimitrov

1
ขอบคุณ. ฉันทำตามที่คุณบอกแล้ว ฉันมี 12 โปรเจ็กต์ในโซลูชันของฉัน แต่ด้วยเหตุผลแปลก ๆ หลังจากที่ฉันพูดว่า 'install-package Microsoft.AspNet.WebApi.Client' ในคอนโซล Library Package Manager มันพิมพ์การติดตามตามปกติแล้วบอกว่า 'ติดตั้ง Microsoft.AspNet เรียบร้อยแล้ว .WebApi.Client ใน MyMVCProjectNameAndNotMyConsoleProjectName ' ครั้งต่อไปที่ฉันเลือกโครงการคอนโซลของฉันและพิมพ์สิ่งเดียวกันในคอนโซลตัวจัดการแพ็คเกจ มันบอกว่า MyMVCProjectName อ้างอิง Microsoft.AspNet.WebApi.Client แล้ว ฉันสับสน.
Water Cooler v2

ใช่ฉันด้วย. เริ่มจากศูนย์ แอปพลิเคชันคอนโซลใหม่เปิดคอนโซล NuGet พิมพ์Install-Package Microsoft.AspNet.WebApi.Clientและลองใช้รหัส
Darin Dimitrov

23
  • หากคุณไม่พบการอ้างอิงการประกอบเมื่อใด (คลิกขวาที่การอ้างอิง -> เพิ่มแอสเซมบลีที่ต้องการ)

ลองใช้คอนโซลตัวจัดการแพ็คเกจนี้
Install-Package System.Net.Http.Formatting.Extension -Version 5.2.3 แล้วเพิ่มโดยใช้การอ้างอิงเพิ่ม


3
ฉันกำลังย้ายแอปพลิเคชัน dotnetcore จาก 2.2 เป็น 3.1 ล่าสุดและพบข้อผิดพลาดนี้แอปของฉันมีการอ้างอิงถึง System.Net.Http.Formatting.Extension v5.2.3 อยู่แล้ว แต่แอปของฉันบ่นข้อผิดพลาดนี้ดังนั้นฉันจึงติดตั้งแพ็คเกจ nuget Microsoft.AspNet.WebApi ลูกค้าตามคำแนะนำของ Rikin และ Darin และหลังจากนั้นปัญหาได้รับการแก้ไข ขอบคุณ
AKS

12

การเพิ่มการอ้างอิงไปยัง System.Net.Http.Formatting.dll อาจทำให้เกิดปัญหา DLL ไม่ตรงกัน ตอนนี้ System.Net.Http.Formatting.dll ดูเหมือนจะอ้างอิงเวอร์ชัน 4.5.0.0 ของ Newtonsoft.Json.DLL ในขณะที่เวอร์ชันล่าสุดคือ 6.0.0.0 นั่นหมายความว่าคุณจะต้องเพิ่มการเปลี่ยนเส้นทางการผูกเพื่อหลีกเลี่ยงข้อยกเว้น. NET Assembly หากคุณอ้างอิงแพ็คเกจ Newtonsoft NuGet หรือ DLL ล่าสุด:

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

ดังนั้นทางเลือกอื่นในการเพิ่มการอ้างอิงไปยัง System.Net.Http.Formatting.dll คือการอ่านการตอบสนองเป็นสตริงจากนั้นจึงแยกตัวเองออกด้วย JsonConvert.DeserializeObject (responseAsString) วิธีการเต็มจะเป็น:

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

หรือถ้าคุณมี VS 2012 คุณสามารถไปที่คอนโซลตัวจัดการแพ็คเกจแล้วพิมพ์ Install-Package Microsoft.AspNet.WebApi.Client

สิ่งนี้จะดาวน์โหลดแพคเกจเวอร์ชันล่าสุด


สิ่งนี้แก้ไขให้ฉัน - ใช้ VS2013
Dan Rayson

หากคุณมีแพคเกจ Microsoft.AspNet.WebApi.Client อยู่แล้วให้ลองยกเลิกการติดตั้งและติดตั้งซึ่งช่วยแก้ไขปัญหาของฉันสำหรับ v 5.2.3
Naveen

-1

ใช้การอ้างอิงการประกอบนี้ในโครงการของคุณ

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

7
คำตอบที่ยอมรับตั้งแต่เดือนมกราคม 2013 ได้อธิบายเรื่องนี้แล้วและมีข้อมูลเพิ่มเติม คำตอบของคุณยังไม่ได้รับการจัดรูปแบบอย่างถูกต้อง
user247702
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.