網(wǎng)站首頁 編程語言 正文
1、遇到的問題
① 遠程主機強迫關(guān)閉了一個現(xiàn)有的連接
相信大家在使用 HttpClient 的時候遇到過 遠程主機強迫關(guān)閉了一個現(xiàn)有的連接 的錯誤,一般的解決方法就是下面這種
解決辦法:在請求方法中指定 ServicePoint 安全協(xié)議
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;
② POST請求某種情況下請求會失敗的解決方案
工作中遇到寫正常的 http post 請求會失敗的問題,于是就在原有的基礎(chǔ)上改動了寫代碼使用HttpRequestMessage 指定 標(biāo)頭、HTTP 謂詞和潛在數(shù)據(jù),詳情見代碼第二個 post 請求方法。
2、使用HttpClient為什么建議使用單例
HttpClient 旨在被實例化一次并在應(yīng)用程序的整個生命周期中重復(fù)使用。為每個請求實例化一個 HttpClient 類將耗盡重負載下可用的套接字數(shù)量。將導(dǎo)致 SocketException 錯誤。
3、基礎(chǔ)代碼實現(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();
}
}
}
原文鏈接:https://blog.csdn.net/qq_43562262/article/details/125042612
相關(guān)推薦
- 2022-02-10 Linux環(huán)境下安裝docker環(huán)境(親測無坑)_docker
- 2023-04-26 C語言函數(shù)調(diào)用基礎(chǔ)應(yīng)用詳解_C 語言
- 2022-09-07 Go泛型應(yīng)用工廠方法及泛型使用_Golang
- 2022-12-28 React+Electron快速創(chuàng)建并打包成桌面應(yīng)用的實例代碼_React
- 2023-06-19 Python進行文件處理的示例詳解_python
- 2022-09-16 一文詳解Python中復(fù)合語句的用法_python
- 2022-07-04 Python自動化辦公之清理重復(fù)文件詳解_python
- 2022-11-05 Android?View轉(zhuǎn)換為Bitmap實現(xiàn)應(yīng)用內(nèi)截屏功能_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支