最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

.net core并发请求发送HttpWebRequest的坑解决

来源:动视网 责编:小采 时间:2020-11-27 22:34:39
文档

.net core并发请求发送HttpWebRequest的坑解决

.net core并发请求发送HttpWebRequest的坑解决:在framework中,大量并发 HttpWebRequest 需要设置一个最大连接数 ServicePointManager.DefaultConnectionLimit = 200; 但是在.net core中却无效,因为core不使用 ServicePointManager 管理连接数,在core中只有使用HttpCli
推荐度:
导读.net core并发请求发送HttpWebRequest的坑解决:在framework中,大量并发 HttpWebRequest 需要设置一个最大连接数 ServicePointManager.DefaultConnectionLimit = 200; 但是在.net core中却无效,因为core不使用 ServicePointManager 管理连接数,在core中只有使用HttpCli


在framework中,大量并发 HttpWebRequest 需要设置一个最大连接数

ServicePointManager.DefaultConnectionLimit = 200;

但是在.net core中却无效,因为core不使用 ServicePointManager 管理连接数,在core中只有使用HttpClient,HttpCilentFactory来管理连接数,如果在core中使用 ServicePointManager 不但不起作用,并且大量并发使用 HttpWebRequest 会导致 IIS 直接假死,所以在core中,只能使用 HttpClient 和 HttpCilentFactory这一条路可走

在Core中的StartUp注册一个HttpClient的名字

 public void ConfigureServices(IServiceCollection services)
 {
 services.AddHttpClient("HttpClientFactoryDemo");
 }

然后在Controller中创建

using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNetCore.Mvc;
 
namespace HttpClientFactoryDemo.Controllers
{
 [Route("api/[controller]")]
 [ApiController]
 public class ValuesController : ControllerBase
 {
 private readonly IHttpClientFactory _httpClientFactory;
 
 public ValuesController(IHttpClientFactory httpClientFactory)
 {
 _httpClientFactory = httpClientFactory;
 }
 
 public static string UrlEncode(string temp, Encoding encoding)
 {
 StringBuilder stringBuilder = new StringBuilder();
 for (int i = 0; i < temp.Length; i++)
 {
 string t = temp[i].ToString();
 string k = HttpUtility.UrlEncode(t, encoding);
 if (t == k)
 {
 stringBuilder.Append(t);
 }
 else
 {
 stringBuilder.Append(k.ToUpper());
 }
 }
 return stringBuilder.ToString();
 }
 
 [HttpGet]
 public async Task<ActionResult> Get()
 {
 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
 string xmlContent = "<?xml version=\"1.0\" encoding=\"GBK\" standalone=\"yes\"?><xml><version>1</version><ins_cd>08A9999999</ins_cd><mchnt_cd>0002900F0370588</mchnt_cd><term_id></term_id><random_str>93b4efa6d0d84808a76355ff0f7a178d</random_str><sign>G1+TBpyEVwsQjeJ9X7zrObRTFtI/ItuJWEEYl3AT/9XlFd844Jv2Wb/gNVkuEVP890Tf1Ub+EaTe1qByHSu97cpQr6riuDxqw2nnjKZBZsG00C1d8070sZPf4c1hkSUfhlR2nPn+7dvIanLCjRFzTgoTQ/WtcArrL/SJIJeaXYg=</sign><order_type>ALIPAY</order_type><goods_des>卡盟测试</goods_des><goods_detail></goods_detail><addn_inf></addn_inf><mchnt_order_no>2018121302054468584629</mchnt_order_no><curr_type></curr_type><order_amt>1</order_amt><term_ip>127.0.0.1</term_ip><txn_begin_ts>20181213020544</txn_begin_ts><goods_tag></goods_tag><auth_code>288232051781304899</auth_code><sence>1</sence><reserved_sub_appid></reserved_sub_appid><reserved_limit_pay></reserved_limit_pay></xml>";
 xmlContent = UrlEncode(xmlContent, Encoding.GetEncoding("GBK"));
 
 Dictionary<string, string> nvs = new Dictionary<string, string> { { "req", xmlContent } };
 Encoding encoding = Encoding.GetEncoding("GBK");
 StringBuilder buffer = new StringBuilder();
 int i = 0;
 IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(nvs);
 foreach (KeyValuePair<string, string> kvp in nvs)
 {
 buffer.AppendFormat(i > 0 ? "&{0}={1}" : "{0}={1}", kvp.Key,
 UrlEncode(kvp.Value, Encoding.GetEncoding("GBK")));
 i++;
 }
 byte[] postBody = encoding.GetBytes(buffer.ToString());
 
 var client = _httpClientFactory.CreateClient("HttpClientFactoryDemo");
 var request = new HttpRequestMessage
 {
 RequestUri = new Uri("https://spay.fuiou.com/commonQuery"),
 Method = HttpMethod.Post,
 Content = new ByteArrayContent(postBody),
 };
 
 request.Content.Headers.ContentType =
 new MediaTypeHeaderValue("application/x-www-form-urlencoded");
 
 return Ok(await client.SendAsync(request));
 
 }
 }
}

总结

文档

.net core并发请求发送HttpWebRequest的坑解决

.net core并发请求发送HttpWebRequest的坑解决:在framework中,大量并发 HttpWebRequest 需要设置一个最大连接数 ServicePointManager.DefaultConnectionLimit = 200; 但是在.net core中却无效,因为core不使用 ServicePointManager 管理连接数,在core中只有使用HttpCli
推荐度:
标签: 解决 请求 net
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top