# 在dotnet framework MVC使用HttpClientFactory,post json,api爬蟲必備 ###### tags: `程式設計` `C#` HttpClientFactory 是在 .net core的元件,要在dotnet framework MVC環境下使用,有兩種方法,基本上都是透過 nuget 安裝元件 以下兩個二選一 1. 安裝 可以相依性插入的 Unity.Mvc 2. 安裝 Microsoft.Owin.Host.SystemWeb (會順便安裝OWIN) 隨後在安裝這兩個 * Microsoft.Extensions.DependencyInjection * Microsoft.Extensions.Http ## httpclient基礎範例程式碼 https://docs.microsoft.com/zh-tw/dotnet/api/system.net.http.httpclient?view=netcore-3.1 其中這兩個方法 (get post) 會是最常用的 * GetStringAsync(String) 將 GET 要求傳送至指定的 URI,並透過非同步作業,以字串形式傳回回應內容。 * PostAsync(String, HttpContent) 以非同步作業的方式,將 POST 要求傳送至指定的 URI。 其餘請參考保哥的影片 https://www.youtube.com/watch?v=TLRmL8CNUT4 或是下載保哥的範例程式碼 https://github.com/doggy8088/Mvc5HttpClientFactoryDemo 範例程式碼僅有 get ,如要使用 post 的程式碼如下 ```=C# public async Task<MyClass> Get() { HttpClient httpClient = _clientFactory.CreateClient(); //以下是走json的方式 var myClass = new MyClass() { Id = 123, Name = "Test" }; var stringContent = new StringContent(JsonConvert.SerializeObject(myClass), System.Text.Encoding.UTF8, "application/json"); var message = await httpClient.PostAsync("https://www.google.com.tw", stringContent); //以下是走表單的方式 var comment = "Hello"; var questionId = 1; var formContent = new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("comment", comment), new KeyValuePair<string, string>("questionId", questionId) }); var message2 = await httpClient.PostAsync("https://www.google.com.tw", formContent); message.EnsureSuccessStatusCode(); var responseContent = await message.Content.ReadAsStringAsync(); var responseModel = JsonConvert.DeserializeObject<MyClass>(responseContent); return responseModel; } ``` ## 工具用網站 要建立測試 api 回傳 json可以利用這個網站 https://designer.mocky.io/ 要把json 轉回 C# 物件,可以利用這個網站 https://json2csharp.com/ ## HttpClientFactory 和 HttpClient 的比較 httpclient的缺點:如果每個連線開啟一個且用完就釋放,但 windows 預設還是要 wait 240秒才會真的釋放 如果預先註冊好共用同一個 httpclient,可以解決上面的wait問題 但是會衍伸新的問題 1. 不同請求有各自的專屬 header 想要共用就不行了,註冊的時候就綁死header 2. 如果dns有更換,要整個程式 restart 才能讓更換 httpclient 目標主機ip httpclientfactory就是解決這些問題用的 ## 參考資料 [Tools] 簡化使用HttpClient呼叫API的好工具 - Microsoft.AspNet.WebApi.Client、Flurl https://dotblogs.com.tw/Null/2020/04/14/213342 How to post data using HttpClient? https://stackoverflow.com/questions/20005355/how-to-post-data-using-httpclient HttpClientFactory 使用說明 及 對 HttpClient 的回顧和對比 https://www.itread01.com/content/1564990083.html