簡體   English   中英

HttpClient 不支持 PostAsJsonAsync 方法 C#

[英]HttpClient not supporting PostAsJsonAsync method C#

我正在嘗試從我的 web 應用程序中調用 web API。 我正在使用.Net 4.5,在編寫代碼時出現錯誤HttpClient不包含定義PostAsJsonAsync方法。

下面是代碼:

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;

我收到錯誤消息:

錯誤:“System.Net.Http.HttpClient”不包含“PostAsJsonAsync”的定義,並且沒有擴展方法“PostAsJsonAsync”接受“System.Net.Http.HttpClient”類型的第一個參數(您是否缺少使用指令還是程序集引用?)

請看看並給我建議。

是的,您需要添加對

System.Net.Http.Formatting.dll

這可以在擴展程序集區域中找到。

實現此目的的一個好方法是將NuGet 包Microsoft.AspNet.WebApi.Client添加到您的項目中。

PostAsJsonAsync不再位於System.Net.Http.dll (.NET 4.5.2) 中。 您可以添加對System.Net.Http.Formatting.dll的引用,但這實際上屬於舊版本。 我在我們的 TeamCity 構建服務器上遇到了這個問題,這兩個不會一起合作。

或者,您可以將PostAsJsonAsync替換為PostAsync調用,這只是新 dll 的一部分。 代替

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

和:

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

請注意, JavaScriptSerializer在命名空間中: System.Web.Script.Serialization

您必須在您的 csproj 中添加程序集引用: System.Web.Extensions.dll

請參閱https://code.msdn.microsoft.com/windowsapps/How-to-use-HttpClient-to-b9289836

缺少的參考是System.Net.Http.Formatting.dll 但更好的解決方案是添加 NuGet 包Microsoft.AspNet.WebApi.Client以確保格式化 dll 的版本與我項目中的System.Net.Http的 .NET 框架版本一起使用。

正如已經討論過的,這種方法自 .NET 4.5.2 起不再可用。 要擴展Jeroen K 的答案,您可以使用擴展方法:

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

現在您可以調用client.PostAsJsonAsync("api/AgentCollection", user)

在我剛剛從源代碼管理中簽出的項目中,我也遇到了這個問題。

症狀是上述錯誤和對System.Net.Http.Formatting的引用的黃色警告三角形

為了解決這個問題,我刪除了損壞的引用,然后使用 NuGet 安裝了最新版本的Microsoft.AspNet.WebApi.Client

好的,現在是世界末日 2020,您可以在 NuGet 包System.Net.Http.Json中找到這些方法。 但請注意,它在內部使用System.Text.Json

如果你真的需要找出哪個 API 駐留在哪里,只需使用https://apisof.net/

我知道這個回復為時已晚,我遇到了同樣的問題,我正在添加System.Net.Http.Formatting.Extension Nuget,在這里和那里檢查后我發現添加了 Nuget 但System.Net.Http.Formatting.dll沒有添加到引用中,我只是重新安裝了 Nuget

嘗試在您的項目中安裝 NuGet 包:Microsoft.AspNet.WebApi.Client:

Install-Package Microsoft.AspNet.WebApi.Client

如果您已經在使用 Newtonsoft.Json 試試這個:

  // Alternative using WebApi.Client 5.2.7
  ////var response = await Client.PutAsJsonAsync(
  ////    "api/AgentCollection", user
  ////    requestListDto)

  var response = await Client.PostAsync("api/AgentCollection", new StringContent(
    JsonConvert.SerializeObject(user), Encoding.UTF8, "application/json"));

性能優於 JavaScriptSerializer。 看看這里https://www.newtonsoft.com/json/help/html/Introduction.htm

您可以使用互聯網上可用的包裝器之一,而不是編寫這么多的代碼來進行簡單的調用。

我編寫了一個名為 WebApiClient 的程序,可在 NuGet 上找到……看看吧!

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

如果您在 Blazor 中玩耍並遇到錯誤,則需要添加包Microsoft.AspNetCore.Blazor.HttpClient

只需使用評論中的提示擴展Jeroen 的答案

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

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

對我來說,經過大量嘗試后,我找到了解決方案

HttpClient

System.Net.Http.HttpClient

如果您使用 Blazor 組件並收到此錯誤,則意味着您的組件無法找到 http 客戶端。 在您的 blazor 組件上使用此行。

@inject HttpClient Http

確保您的程序或啟動文件中有這一行

builder.Services.AddScoped(sp => 
new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });

根據這里談論使用 Newtonsoft.Json 的答案,我為此創建了一個助手 class:

public class JsonContent : StringContent
{
    public JsonContent(object model) 
        : base(JsonConvert.SerializeObject(model), Encoding.UTF8, "application/json")
    {
    }
}

示例用法:

using (var content = new JsonContent(user))
{
    var response = client.PostAsync("api/AgentCollection", content).Result;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM