HttpClientがPostAsJsonAsyncメソッドをサポートしていないC#


255

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」の定義が含まれておらず、タイプ「System.Net.Http.HttpClient」の最初の引数を受け入れる拡張メソッド「PostAsJsonAsync」が見つかりませんでした(見つからないディレクティブまたはアセンブリ参照を使用していますか?)

見て、アドバイスしてください。


13
最良のオプションは、「Microsoft.AspNet.WebApi.Client」.Nugetパッケージを追加することです。それでおしまい!
Sachin Pawar 2016

回答:


435

はい、参照を追加する必要があります

System.Net.Http.Formatting.dll

これは拡張機能のアセンブリ領域にあります。

これを実現する良い方法は、プロジェクトにNuGetパッケージMicrosoft.AspNet.WebApi.Clientを追加することです。


7
エラーが発生しました: "ファイルまたはアセンブリをロードできませんでした 'Newtonsoft.Json、Version = 4.5.0.0、Culture = neutral、PublicKeyToken = 30ad4fe6b2a6aeed'またはその依存関係の1つ。指定されたファイルが見つかりません。"
Jidheeshラジャン

89
書式設定DLLのバージョンがプロジェクト内の「System.Net.Http」の.NETフレームワークバージョンで機能するようにするには、NuGetパッケージ「Microsoft.AspNet.WebApi.Client」を追加する必要があることがわかりました。
トッドH.

27
標準のシステムアセンブリを参照するために、インターネット上のランダムな場所からオープンソースのものをダウンロードして機能させる必要があるのはなぜですか?依存関係を解決できない場合、なぜコンパイルされるのですか?これは私を無限にイライラさせます!
ニュートリノ2014年

4
@Neutrino自分でコードを書いてみませんか?Microsoftや他の場所の人々が無料で使用できるコードを書いてくれたことに感謝するべきです
reggaeguitar

4
PM> Install-Package System.Net.Http.Formatting.Extension
Yar

194

PostAsJsonAsyncSystem.Net.Http.dll(.NET 4.5.2)にはありません。への参照を追加できますがSystem.Net.Http.Formatting.dll、これは実際には古いバージョンに属しています。TeamCityビルドサーバーでこれに問題が発生しました。これら2つは連携しません。

または、新しいdllの一部でPostAsJsonAsyncあるPostAsync呼び出しに置き換えることもできます。交換する

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を参照してください


7
これが答えです。何かを行うための最良の方法は、その正しい方法です
Alireza

4
これが今のところ最良の答えです。NuGetパッケージまたはDLLを追加しないでください。
グーカンクルト・

3
完全に最良の答えです。選択した回答はベストプラクティスはありません。実際には、DLLを参照しないことをお勧めします
Astaar

4
トピック外ですが、とにかく言及したいのですが、await FooAsync()ではなくを使用してくださいFooAsync().Result。後者はデッドロックする可能性があります。stackoverflow.com/q/17248680/2272514およびその受け入れられた回答を参照してください。詳細についての良いリンクもあります。
Thomas Schreiter

2
「application / json」の代わりにタイプを使用するには、MediaTypeNames.Application.Jsondocs.microsoft.com/ en
us

164

欠落している参照はSystem.Net.Http.Formatting.dllです。しかし、より良い解決策は、NuGetパッケージを追加してMicrosoft.AspNet.WebApi.Client、フォーマットdllのバージョンがSystem.Net.Http私のプロジェクトの.NETフレームワークバージョンで動作することを確認することです。


1
@Yuval-私が提案した「解決策」はコメントのように聞こえたことがわかりました Andreoが私が提案したNuGetパッケージを作成したことがわかりました。
トッドH.

これが私への答えでした!(私の質問へ)
JenonD 2017年

34

すでに論じたように、このメソッドは.NET 4.5.2以降では利用できなくなりました。展開するにはイェルーン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)


12

ソース管理からチェックアウトしたばかりのプロジェクトにもこの問題がありました。

症状は、上記のエラーとへの参照の黄色の警告三角形でした System.Net.Http.Formatting

これを修正するために、壊れた参照を削除し、NuGetを使用して最新バージョンのをインストールしましたMicrosoft.AspNet.WebApi.Client


2
できます!Nuget Consoleを使用してインストールするには、次のように入力しますInstall-Package Microsoft.AspNet.WebApi.Client
yu yang Jian

4

私は、この返信が遅すぎる知っている私は同じ問題を持っていたし、私が追加されたSystem.Net.Http.Formatting.Extension、ここで確認した後、Nugetを、私はNugetが追加されたことがあったが、System.Net.Http.Formatting.dll参照に追加されませんでした、私はちょうどNugetを再インストール



2

この量のコードを記述して単純な呼び出しを行う代わりに、インターネット経由で利用可能なラッパーの1つを使用できます。

NuGetで入手可能なWebApiClientと呼ばれるものを作成しました。

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


@Andreoリンク(webapiclient.azurewebsites.net)は、2017年11月30日のように壊れています。NuGet作業リンクはnuget.org/packages/WebApiRestService.WebApiClient
Vishwajit G

残念ながら、Microsoftはazureサブスクリプションを終了し、URLは無効になりました:(
Andreo Romera

2

Blazorで遊んでいてエラーが発生した場合は、パッケージを追加する必要がありますMicrosoft.AspNetCore.Blazor.HttpClient


0

コメントのヒントでJeroenの答えを広げるだけです:

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

var response = await client.PostAsync("api/AgentCollection", content);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.