HttpClient not supporting PostAsJsonAsync method C#
Solution 1
Yes, you need to add a reference to
System.Net.Http.Formatting.dll
This can be found in the extensions assemblies area.
A good way of achieving this is by adding the NuGet package Microsoft.AspNet.WebApi.Client
to your project.
Solution 2
PostAsJsonAsync
is no longer in the System.Net.Http.dll
(.NET 4.5.2). You can add a reference to System.Net.Http.Formatting.dll
, but this actually belongs to an older version. I ran into problems with this on our TeamCity build server, these two wouldn't cooperate together.
Alternatively, you can replace PostAsJsonAsync
with a PostAsync
call, which is just part of new dll.
Replace
var response = client.PostAsJsonAsync("api/AgentCollection", user).Result;
With:
var response = client.PostAsync("api/AgentCollection", new StringContent(
new JavaScriptSerializer().Serialize(user), Encoding.UTF8, "application/json")).Result;
Note that JavaScriptSerializer
is in the namespace: System.Web.Script.Serialization
.
You will have to add an assembly reference in your csproj: System.Web.Extensions.dll
See https://code.msdn.microsoft.com/windowsapps/How-to-use-HttpClient-to-b9289836
Solution 3
The missing reference is the System.Net.Http.Formatting.dll
. But the better solution is to add the NuGet package Microsoft.AspNet.WebApi.Client
to ensure the version of the formatting dll worked with the .NET framework version of System.Net.Http
in my project.
Solution 4
As already debatted, this method isn't available anymore since .NET 4.5.2. To expand on Jeroen K's answer you can make an extension method:
public static async Task<HttpResponseMessage> PostAsJsonAsync<TModel>(this HttpClient client, string requestUrl, TModel model)
{
var serializer = new JavaScriptSerializer();
var json = serializer.Serialize(model);
var stringContent = new StringContent(json, Encoding.UTF8, "application/json");
return await client.PostAsync(requestUrl, stringContent);
}
Now you are able to call client.PostAsJsonAsync("api/AgentCollection", user)
.
Solution 5
I had this issue too on a project I'd just checked out from source control.
The symptom was the error described above and a yellow warning triangle on a reference to System.Net.Http.Formatting
To fix this, I removed the broken reference and then used NuGet to install the latest version of Microsoft.AspNet.WebApi.Client
.
Related videos on Youtube
Comments
-
Jidheesh Rajan over 3 years
I am trying to call a web API from my web application. I am using .Net 4.5 and while writing the code I am getting the error
HttpClient
does not contain a definitionPostAsJsonAsync
method.Below is the code:
HttpClient client = new HttpClient(); client.BaseAddress = new Uri("http://localhost:51093/"); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json")); var user = new Users(); user.AgentCode = 100; user.Remarks = "Test"; user.CollectionDate = System.DateTime.Today; user.RemittanceDate = System.DateTime.Today; user.TotalAmount = 1000; user.OrgBranchID = 101; var response = client.PostAsJsonAsync("api/AgentCollection", user).Result;
and I am getting the error message:
Error: 'System.Net.Http.HttpClient' does not contain a definition for 'PostAsJsonAsync' and No extension method 'PostAsJsonAsync' accepting a first argument of type 'System.Net.Http.HttpClient' could be found (are you missing a using directive or an assembly reference?)
Please have a look and advice me.
-
Sachin Pawar almost 8 yearsThe best option is to add 'Microsoft.AspNet.WebApi.Client' .Nuget package. That's it!
-
-
Jidheesh Rajan over 10 yearsNow i am getting an error :" Could not load file or assembly 'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The system cannot find the file specified. "
-
Allan Elder over 10 yearsGo into NuGet and look up Json.NET under online packages, or you can download from here if you aren't using NuGet get it from here james.newtonking.com/json
-
vikingben over 10 yearsHere is the console command if anyone is looking nuget.org/packages/System.Net.Http.Formatting
-
Todd H. almost 10 yearsFound I had to add the NuGet package "Microsoft.AspNet.WebApi.Client" to ensure the version of the formatting dll worked with the .NET framework version of "System.Net.Http" in my project.
-
Todd H. almost 10 years@Yuval - I realize now that the "solution" I suggested sounded like a comment. It turns out that Andreo authored the NuGet package I suggested.
-
Neutrino over 9 yearsWhy does referencing a standard system assembly require me to download open source stuff from random locations on the Internet in order to get it to function? Why does this even compile if it cannot resolve its dependencies? This irks me to no end!
-
reggaeguitar almost 9 years@Neutrino Would you rather write the code yourself? You should be thankful that the folks at Microsoft and elsewhere have written code you can use for free
-
sasha.sochka over 8 yearsis there a way to use this method from UWP app?
-
Alireza over 8 yearsThis should be the answer. The best way to do something is the correct way of it
-
Gökhan Kurt over 8 yearsThis is the best answer so far. Do not try adding NuGet packages or dlls.
-
Yar about 8 yearsPM> Install-Package System.Net.Http.Formatting.Extension
-
Astaar almost 8 yearsTotally the best answer. Selected answer is not a best practice at all, in fact Microsoft recommends not to reference DLLs
-
RasikaSam over 7 yearsThis was the answer to me! (to my question)
-
flexxxit about 7 yearshow will this be added in .net4
-
Vishwajit G over 6 years@Andreo The link (webapiclient.azurewebsites.net) is now broken as on 30-Nov-2017. NuGet working link is nuget.org/packages/WebApiRestService.WebApiClient
-
yu yang Jian over 6 yearsIt works! To install by Nuget Console enter
Install-Package Microsoft.AspNet.WebApi.Client
-
Andreo Romera about 6 yearsUnfortunately Microsoft has ended my azure subscription and the url is no longer valid :(
-
Zin Min about 6 yearsAfter I added System.Net.Http.Formatting.Extension from NuGet, HttpClient was thrown an error. Now I am finding the root cause. Visual Studio 2017 with .NET Framework 4.7
-
Thomas Schreiter almost 6 yearsOff topic, but I want to mention it anyways: Use
await FooAsync()
instead ofFooAsync().Result
. The latter one can deadlock. See stackoverflow.com/q/17248680/2272514 and its accepted answer. There are also good links about details. -
daviesdoesit over 5 yearsTo use a type instead of "application/json" you could use MediaTypeNames.Application.Json docs.microsoft.com/en-us/dotnet/api/…
-
tmutton almost 5 yearsThis helped me and is obviously preferable to installing a library via nuget. Thank you.
-
Yusha almost 5 yearsWhat the answer should actually say. Nuget > Install System.Net.Http then install System.Net.Http.Formatting.Extension
-
Cameron Forward almost 5 yearsWorked a charm - I successfully used JsonConvert.SerializeObject(user) in place of your serialiser.
-
Ryanman almost 5 yearsThis is the second time I've forgotten this answer. PostAsJsonAsync will mysteriously exclude properties from the object you're posting when serializing etc. and no amount of attribute changes etc. will fix it. You MUST serialize yourself and you MUST use the "raw" PostAsync.
-
goodeye almost 5 yearsGreat - I used this for the general idea when debugging some json from .net core 2.2. From this post stackoverflow.com/a/29843542/292060 it shows using existing Newtonsoft library to serialize (even though the post is about how that's being removed from core 3.0)
-
Benj Sanders over 4 years@Yusha I needed to add Microsoft.AspNet.WebApi.Client and System.Net.Http.Formatting.Extension, then it compiled.
-
rfcdejong over 3 yearsWorks for me for .net framework and netcore3.1 (which uses netstandard2.0 in this library)
-
rfcdejong over 3 years2020 answer -> stackoverflow.com/a/64015973/578552
-
SomeoneElse over 2 yearsActually, this is a really good demonstration of why using "one of the wrappers available over the internet" might not be a good idea. Every external dependency that a project has is one more thing that can go wrong.