欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解C#中HttpClient的用法及相關(guān)問題的解決方法

 更新時(shí)間:2022年11月18日 11:23:39   作者:黑夜中的潛行者  
相信大家在使用 HttpClient 的時(shí)候遇到過 遠(yuǎn)程主機(jī)強(qiáng)迫關(guān)閉了一個(gè)現(xiàn)有的連接 的錯(cuò)誤。本文就來說說它的解決方法以及HttpClient的正確用法,需要的可以參考一下

1、遇到的問題

① 遠(yuǎn)程主機(jī)強(qiáng)迫關(guān)閉了一個(gè)現(xiàn)有的連接

相信大家在使用 HttpClient 的時(shí)候遇到過 遠(yuǎn)程主機(jī)強(qiáng)迫關(guān)閉了一個(gè)現(xiàn)有的連接 的錯(cuò)誤,一般的解決方法就是下面這種

解決辦法:在請求方法中指定 ServicePoint 安全協(xié)議

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;

② POST請求某種情況下請求會失敗的解決方案

工作中遇到寫正常的 http post 請求會失敗的問題,于是就在原有的基礎(chǔ)上改動(dòng)了寫代碼使用HttpRequestMessage 指定 標(biāo)頭、HTTP 謂詞和潛在數(shù)據(jù),詳情見代碼第二個(gè) post 請求方法。

2、使用HttpClient為什么建議使用單例

HttpClient 旨在被實(shí)例化一次并在應(yīng)用程序的整個(gè)生命周期中重復(fù)使用。為每個(gè)請求實(shí)例化一個(gè) HttpClient 類將耗盡重負(fù)載下可用的套接字?jǐn)?shù)量。將導(dǎo)致 SocketException 錯(cuò)誤。

3、基礎(chǔ)代碼實(shí)現(xiàn)

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Reflection;
using System.Text;

namespace Clear.DataServices.HttpHelper
{
    public class HttpClientService
    {
        private static HttpClientService _instance;

        private static readonly object _lock = new object();
        
        private static HttpClient _client;
        
        public HttpClientService() { }
        
        public static HttpClientService GetInstance()
        {
            if (_instance == null)
            {
                lock (_lock)
                {
                    if (_instance == null)
                    {
                        _instance = new HttpClientService();
                    }
                    
                    if (_client is null)
					{
					    _client = new HttpClient();
					}
                }
            }
            return _instance;
        }
      
        /// <summary>
        /// HttpClient Get請求
        /// </summary>
        /// <param name="url">請求地址</param>
        /// <returns></returns>
        public string HttpGet(string url)
        {
            try
            {
                if (_client.BaseAddress is null)
				{
				    _client.BaseAddress = new Uri(url);
				}
              
                client.DefaultRequestHeaders.Accept.Clear();
                HttpResponseMessage response = client.GetAsync(url).Result;

                response.EnsureSuccessStatusCode();
                string responseBody = response.Content.ReadAsStringAsync().Result;

                return responseBody;                
            }
            catch (Exception e)
            {                
                object errorMessage = new
                {
                    code = "-1",
                    message = e.Message
                };
                return JsonConvert.SerializeObject(errorMessage);
            }
        }

        /// <summary>
        /// HttpClient Post請求
        /// </summary>
        /// <param name="url">請求地址</param>
        /// <param name="content">HttpContent</param>
        /// <returns></returns>
        public string HttpPost(string url, string content, string token = null)
        {
            try
            {
                if (_client.BaseAddress is null)
				{
				    _client.BaseAddress = new Uri(url);
				}
				
                // System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;

                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Connection.Add("keep-alive");
                if (!token.IsNullOrEmpty())
                {
                    client.DefaultRequestHeaders.Add("Authorization-Token", token);
                }
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
             
                HttpResponseMessage response = client.PostAsync(url, new StringContent(content, Encoding.UTF8, "application/json")).Result;
                response.EnsureSuccessStatusCode();
                string responseBody = response.Content.ReadAsStringAsync().Result;
             
                return responseBody;                
            }
            catch (Exception e)
            {                
                object errorMessage = new
                {
                    code = "-1",
                    message = e.Message
                };
                return JsonConvert.SerializeObject(errorMessage);
            }
        }

        /// <summary>
        /// HttpClient Post請求
        /// </summary>
        /// <remarks>
        /// 用于非正常http請求
        /// </remarks>
        /// <param name="url"></param>
        /// <param name="content"></param>
        /// <returns></returns>
        public string HttpPost(string url, string content)
        {
            try
            {
                using (var request = new HttpRequestMessage(new HttpMethod("Post"), url))
                {
                    // System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;

                    request.Headers.TryAddWithoutValidation("Content-Type", "application/json");

                    request.Content = new StringContent(content);

                    request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");
                    var response = _client.SendAsync(request).Result;
                    return response.Content.ReadAsStringAsync().Result;
                }
            }
            catch (Exception e)
            {
                object errorMessage = new
                {
                    code = "-1",
                    message = e.Message
                };
                return JsonConvert.SerializeObject(errorMessage);
            }
        }

        /// <summary>
        /// Model對象轉(zhuǎn)換為uri網(wǎng)址參數(shù)形式
        /// </summary>
        /// <param name="obj">Model對象</param>
        /// <param name="url">前部分網(wǎng)址</param>
        /// <returns></returns>
        public string GetUriParam(object obj, string url = "")
        {
            PropertyInfo[] propertis = obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
            StringBuilder sb = new StringBuilder();
            sb.Append(url);
            sb.Append("?");
            foreach (var p in propertis)
            {
                var v = p.GetValue(obj, null);
                if (v == null) continue;

                sb.Append(p.Name);
                sb.Append("=");
                sb.Append(Uri.EscapeDataString(v.ToString()));//將字符串轉(zhuǎn)換為它的轉(zhuǎn)義表示形式,HttpUtility.UrlEncode是小寫
                sb.Append("&");
            }
            sb.Remove(sb.Length - 1, 1);

            return sb.ToString();
        }
    }
}

到此這篇關(guān)于詳解C#中HttpClient的用法及相關(guān)問題的解決方法的文章就介紹到這了,更多相關(guān)C# HttpClient內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解C#?wpf如何嵌入hwnd窗口

    詳解C#?wpf如何嵌入hwnd窗口

    wpf是Direct?UI,窗口中只有一個(gè)hwnd句柄,大部分控件都是直接在上面繪制的,本文主要來和大家講講如何嵌入hwnd窗口,感興趣的可以了解一下
    2024-03-03
  • C#實(shí)現(xiàn)將json轉(zhuǎn)換為DataTable的方法

    C#實(shí)現(xiàn)將json轉(zhuǎn)換為DataTable的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)將json轉(zhuǎn)換為DataTable的方法,涉及C#操作json及DataTable的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • C#使用正則表達(dá)式隱藏手機(jī)號中間四位為*

    C#使用正則表達(dá)式隱藏手機(jī)號中間四位為*

    這篇文章主要介紹了C#使用正則表達(dá)式隱藏手機(jī)號中間四位為*的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C# 的關(guān)鍵字詳細(xì)介紹

    C# 的關(guān)鍵字詳細(xì)介紹

    本文將詳細(xì)介紹C#關(guān)鍵字的應(yīng)用,可供有需要的朋友參考
    2012-11-11
  • C#關(guān)聯(lián)自定義文件類型到應(yīng)用程序并實(shí)現(xiàn)自動(dòng)導(dǎo)入功能

    C#關(guān)聯(lián)自定義文件類型到應(yīng)用程序并實(shí)現(xiàn)自動(dòng)導(dǎo)入功能

    今天通過本文給大家分享C#關(guān)聯(lián)自定義文件類型到應(yīng)用程序并實(shí)現(xiàn)自動(dòng)導(dǎo)入功能,代碼中寫入了兩個(gè)注冊表,實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • C#?字典Dictionary的具體用法

    C#?字典Dictionary的具體用法

    本文主要介紹了C#?字典Dictionary的具體用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • TortoiseSVN使用教程

    TortoiseSVN使用教程

    TortoiseSVN 是 Subversion 版本控制系統(tǒng)的一個(gè)免費(fèi)開源客戶端,可以超越時(shí)間的管理文件和目錄。本文給大家介紹TortoiseSVN使用教程,對tortoisesvn使用相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2015-12-12
  • C#判斷單詞個(gè)數(shù)方法總結(jié)

    C#判斷單詞個(gè)數(shù)方法總結(jié)

    我們給大家總計(jì)了C#中判斷英文單詞個(gè)數(shù)的方法以及排序的技巧,對此有需要的朋友可以測試下。
    2018-03-03
  • c#如何使用UDP進(jìn)行聊天通信

    c#如何使用UDP進(jìn)行聊天通信

    這篇文章主要介紹了c#如何使用UDP進(jìn)行聊天通信問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 在GridControl控件上綁定圖片的幾種操作方式詳解

    在GridControl控件上綁定圖片的幾種操作方式詳解

    GridControl控件是經(jīng)常用來綁定數(shù)據(jù)的,一般以常規(guī)的字符內(nèi)容為主,有時(shí)候也會有圖片的顯示需要,這篇文章主要介紹了在GridControl控件上綁定圖片的幾種操作方式詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評論