HttpClient não oferece suporte ao método PostAsJsonAsync C #

255

Estou tentando chamar uma API da web do meu aplicativo da web. Estou usando o .net 4.5 e, ao escrever o código, estou recebendo o erro HttpClientnão contém um PostAsJsonAsyncmétodo de definição .

Abaixo está o código:

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;

e estou recebendo a mensagem de erro:

Erro: 'System.Net.Http.HttpClient' não contém uma definição para 'PostAsJsonAsync' e nenhum método de extensão 'PostAsJsonAsync' aceitando um primeiro argumento do tipo 'System.Net.Http.HttpClient' pode ser encontrado (está faltando um usando diretiva ou uma referência de montagem?)

Por favor, dê uma olhada e me aconselhar.

Jidheesh Rajan
fonte
13
A melhor opção é adicionar o pacote 'Microsoft.AspNet.WebApi.Client' .Nuget. É isso aí!
Sachin Pawar

Respostas:

435

Sim, você precisa adicionar uma referência a

System.Net.Http.Formatting.dll

Isso pode ser encontrado na área de montagens de extensões.

Uma boa maneira de conseguir isso é adicionando o pacote NuGetMicrosoft.AspNet.WebApi.Client ao seu projeto.

Justin Harvey
fonte
7
Agora estou recebendo um erro: "Não foi possível carregar o arquivo ou o conjunto 'Newtonsoft.Json, Versão = 4.5.0.0, Culture = neutral, PublicKeyToken = 30ad4fe6b2a6aeed' ou uma de suas dependências. O sistema não consegue encontrar o arquivo especificado."
Jidheesh Rajan
89
Descobri que tinha que adicionar o pacote NuGet "Microsoft.AspNet.WebApi.Client" para garantir que a versão da DLL de formatação funcionasse com a versão do .NET Framework do "System.Net.Http" no meu projeto.
Todd H.
27
Por que fazer referência a um conjunto de sistema padrão exige que eu baixe material de código aberto de locais aleatórios na Internet para que ele funcione? Por que isso é compilado se não pode resolver suas dependências? Isso me irrita sem fim!
Neutrino 01/10
4
@ Neutrino Você prefere escrever o código você mesmo? Você deve ser grato que o pessoal da Microsoft e em outros lugares têm escrito código que você pode usar gratuitamente
reggaeguitar
4
PM> Install-Package System.Net.Http.Formatting.Extension #
Yar
194

PostAsJsonAsyncnão está mais no System.Net.Http.dll(.NET 4.5.2). Você pode adicionar uma referência a System.Net.Http.Formatting.dll, mas isso realmente pertence a uma versão mais antiga. Eu tive problemas com isso no nosso servidor de construção TeamCity, esses dois não cooperaram juntos.

Como alternativa, você pode substituir PostAsJsonAsyncpor uma PostAsyncchamada, que é apenas parte da nova dll. Substituir

var response = client.PostAsJsonAsync("api/AgentCollection", user).Result;

Com:

var response = client.PostAsync("api/AgentCollection", new StringContent(
   new JavaScriptSerializer().Serialize(user), Encoding.UTF8, "application/json")).Result;

Note-se que JavaScriptSerializeré no espaço de nomes: System.Web.Script.Serialization.

Você precisará adicionar uma referência de montagem no seu csproj: System.Web.Extensions.dll

Consulte https://code.msdn.microsoft.com/windowsapps/How-to-use-HttpClient-to-b9289836

Jeroen K
fonte
7
Essa deve ser a resposta. A melhor maneira de fazer alguma coisa é a maneira correta dele
Alireza
4
Esta é a melhor resposta até agora. Não tente adicionar pacotes ou dlls do NuGet.
Gökhan Kurt
3
Totalmente a melhor resposta. Resposta escolhida não é a melhor prática em tudo , na verdade, a Microsoft não recomenda a DLLs de referência
Astaar
4
Fora do tópico, mas quero mencioná-lo de qualquer maneira: use em await FooAsync()vez de FooAsync().Result. O último pode entrar em conflito. Consulte stackoverflow.com/q/17248680/2272514 e sua resposta aceita. Também existem bons links sobre detalhes.
Thomas Schreiter
2
Para usar um tipo em vez de "application / json", você pode usar MediaTypeNames.Application.Json docs.microsoft.com/en-us/dotnet/api/…
daviesdoesit
164

A referência ausente é o System.Net.Http.Formatting.dll. Mas a melhor solução é adicionar o pacote NuGet Microsoft.AspNet.WebApi.Clientpara garantir que a versão da DLL de formatação funcione com a versão do .NET framework do System.Net.Httpmeu projeto.

Todd H.
fonte
1
@ Yuval - Agora percebo que a "solução" que sugeri parecia um comentário. Acontece que o Andreo foi o autor do pacote NuGet que sugeri.
Todd H.
Esta foi a resposta para mim! (a minha pergunta)
JenonD
34

Como já debatido, esse método não está mais disponível desde o .NET 4.5.2. Para expandir a resposta de Jeroen K, você pode criar um método de extensão:

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

Agora você pode ligar client.PostAsJsonAsync("api/AgentCollection", user).

Christian Gollhardt
fonte
12

Eu também tive esse problema em um projeto que acabei de fazer check-out no controle de origem.

O sintoma foi o erro descrito acima e um triângulo de advertência amarelo em uma referência a System.Net.Http.Formatting

Para corrigir isso, removi a referência quebrada e usei o NuGet para instalar a versão mais recente do Microsoft.AspNet.WebApi.Client.

Mr Giggles
fonte
2
Funciona! Para instalar pelo Nuget Console, digiteInstall-Package Microsoft.AspNet.WebApi.Client
yu yang Jian
4

Sei que esta resposta é tarde demais, tive o mesmo problema e estava adicionando o System.Net.Http.Formatting.ExtensionNuget, depois de verificar aqui e ali descobri que o Nuget foi adicionado, mas System.Net.Http.Formatting.dllnão foi adicionado às referências, apenas reinstalei o Nuget

Abed Kaff
fonte
3

Tente instalar no seu projeto o pacote NuGet: Microsoft.AspNet.WebApi.Client:

Install-Package Microsoft.AspNet.WebApi.Client
Alexandre Spreafico Novaes
fonte
2

Em vez de escrever essa quantidade de código para fazer uma chamada simples, você pode usar um dos wrappers disponíveis na Internet.

Eu escrevi um chamado WebApiClient, disponível no NuGet ... confira!

https://www.nuget.org/packages/WebApiRestService.WebApiClient/

Andreo Romera
fonte
@Andreo O link ( webapiclient.azurewebsites.net ) agora está quebrado como em 30 de novembro de 2017. O link de trabalho do NuGet é nuget.org/packages/WebApiRestService.WebApiClient
Vishwajit G:
Infelizmente a Microsoft encerrou minha assinatura do azure e o URL não é mais válido :(
Andreo Romera
2

Se você estiver brincando no Blazor e receber o erro, precisará adicionar o pacote Microsoft.AspNetCore.Blazor.HttpClient.

Briseis
fonte
0

Apenas expandindo a resposta de Jeroen com as dicas nos comentários:

var content = new StringContent(
    JsonConvert.SerializeObject(user), 
    Encoding.UTF8, 
    MediaTypeNames.Application.Json);

var response = await client.PostAsync("api/AgentCollection", content);
Clique OK
fonte