视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
.net core并发请求发送HttpWebRequest的坑解决
2020-11-27 22:34:39 责编:小采
文档


在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/gNVkuEVP0Tf1Ub+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>2882320517813049</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));
 
 }
 }
}

总结

下载本文
显示全文
专题