.NET4.0 中如何使用 HttpClient Post

本文所记述内容发生的场景是,.NET4.0 客户端不断向服务端 WebAPI 日志接口发送日志数据,发现服务端接受到的日志频率非常低(大概每秒 1 条记录),服务器压力并不大,而客户端并没有限制日志发送频率,是什么原因导致频率降低了?

经过排查发现是 HttpWebRequest 问题,并发非常低,每次请求都要创建 HttpWebRequest,消耗资源较多,降低了客户端性能。为了解决该问题,需要引入  System.Net.Http.HttpClient,输入 nuget 命令:

Install-Package Microsoft.Net.Http -Version 2.0.20710

由于 WebAPI 日志接口是基于 JWT 验证,且须使用 Post 方法请求。为了降低高并发下系统资源消耗,可将 HttpClient 单独创建,再使用扩展方法进行 POST 请求调用,以免每次调用创建 HttpClient,以下是 .NET 4.0下 POST 请求 WebAPI 具体代码: 

namespace Pzy.WebApi 
{ 
   public static class WebApiHttpClient 
   { 
       /// <summary> 
       /// 创建 Http 客户端 
       /// </summary> 
       /// <param name="baseAddress">基础地址</param> 
       /// <returns></returns> 
       public static HttpClient CreateHttpClient(string baseAddress) 
       { 
           var httpClient = new HttpClient(); 
           httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
           httpClient.BaseAddress = new Uri(baseAddress); 
           return httpClient; 
       } 
       /// <summary> 
       /// POST 请求 
       /// </summary> 
       /// <typeparam name="TResult">返回结果类型</typeparam> 
       /// <param name="httpClient"></param> 
       /// <param name="uri">接口uri</param> 
       /// <param name="accessToken">访问令牌</param> 
       /// <param name="body">请求参数对象</param> 
       /// <param name="timeout">超时时间</param> 
       /// <returns></returns> 
       public static TResult Post<TResult>(this HttpClient httpClient, string uri, string accessToken, object body, int? timeout = null) 
       { 
           httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); 
            
           if(timeout.HasValue) 
           { 
               httpClient.Timeout = TimeSpan.FromMilliseconds(timeout.Value); 
           } 
           var jsonString = Object2JsonString(body); 
           var requestContent = new StringContent(jsonString, Encoding.UTF8, "application/json"); 
           var httpResponse = httpClient.PostAsync(uri, requestContent).Result; 
           if (httpResponse.IsSuccessStatusCode) 
           { 
               var responseContent = httpResponse.Content.ReadAsStringAsync().Result; 
               var result = JsonString2Object<TResult>(responseContent); 
               return result; 
           } 
           else 
           { 
               return default(TResult); 
           } 
       } 
       /// <summary> 
       /// 将Json字串转化为对象 
       /// </summary> 
       /// <typeparam name="TObject">对象类型</typeparam> 
       /// <param name="responseJson">响应Json</param> 
       /// <returns></returns> 
       private static TObject JsonString2Object<TObject>(string responseJson) 
       { 
           return JsonConvert.DeserializeObject<TObject>(responseJson, 
               new JsonSerializerSettings 
               { 
                   ContractResolver = new CamelCasePropertyNamesContractResolver() 
               }); 
       } 
       /// <summary> 
       /// 对象转化为Josn字串 
       /// </summary> 
       /// <param name="obj">对象</param> 
       /// <returns></returns> 
       private static string Object2JsonString(object obj) 
       { 
           if (obj == null) 
           { 
               return ""; 
           } 
           return JsonConvert.SerializeObject(obj, 
               new JsonSerializerSettings 
               { 
                   ContractResolver = new CamelCasePropertyNamesContractResolver() 
               }); 
       } 
   } 
}

以上调用示例如下:

namespace Pzy.WebApi 
{ 
   public class WebApiDemo
   { 
       public void PostLog() 
       {     
           //创建 
           var httpClient = WebApiHttpClient.CreateHttpClient("http://api.pzy.io"); 
           //请求 
           httpClient.Post<ApiResult<string>>("/pzyapi/logs", "accessToken",  
               new { Title = "logTitle", Content = "logContent" }); 
       } 
   } 
}

全文完,参考资料:

https://stackoverflow.com/questions/14627399/setting-authorization-header-of-httpclient

https://stackoverflow.com/questions/14627399/setting-authorization-header-of-httpclient/32691285

https://www.c-sharpcorner.com/UploadFile/dacca2/http-request-methods-get-post-put-and-delete/

《.NET4.0 中如何使用 HttpClient Post》的相关评论

发表评论

必填项已用 * 标记,邮箱地址不会被公开。