C#,使用httpclient发送异步post请求,出现没有请求体的情况

在使用C#进行多次异步post请求的时候,只有首次发送有请求体,后续发送接收方均检测没有请求体而报错。不知道是什么原因,请教一下大家,使用的标准的post异步请求方式。
具体代码,

private void TwoNetSend(string objectURL, string sendData)
        {
            string URL = "";
            string requestURI = "";
            bool bEnable = GetTwoNetParas(out URL, out requestURI);
            //bool bEnable = true;
            if (bEnable == false)
            {
                return;
            }
            try
            {
                HttpClient _Client = new HttpClient();
                _Client.BaseAddress = new Uri(URL);
                _Client.DefaultRequestHeaders.Accept.Add(
                    new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

                Dictionary<string, string> paras = new Dictionary<string, string>();
                paras.Add("URL", objectURL);
                paras.Add("sendData", sendData);
                string pc = JsonConvert.SerializeObject(paras);
                StringContent postContent = new StringContent(pc, Encoding.GetEncoding("GBK"), "application/json");

                var response = _Client.PostAsync(requestURI, postContent).Result;
                bool result = response.IsSuccessStatusCode;

                _Client.Dispose();
            }
            catch (Exception ex)
            {
                Noter.Write(ex.ToString(), "TwoNetSend");
                return;
            }
        }

代码没有贴,不能判断啊
请求体要你自己写 requestStream.Write(postData)

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 看下这篇博客,也许你就懂了,链接:httpclient4 post提交请求乱码问题解决
  • 除此之外, 这篇博客: 使用HttpClient发送Http请求详细示例中的 四、POST有参(对象+普通参数) 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:

    问题原因: 在这段代码中,问题出现在第二次POST请求时。原因是在每次发送请求时,StringContent对象在使用后会被释放掉,因此第二次请求时,没有请求体。这是因为StringContent实现了IDisposable接口,在使用完之后应该及时释放资源。

    解决方案: 为了解决这个问题,我们可以改变代码的结构,使得每次都创建一个新的StringContent对象,并且不立即释放资源,而是等待请求完成后再进行释放。

    下面是修改后的代码:

    using System;
    using System.Net.Http;
    using System.Threading.Tasks;
    
    public class Program
    {
        public static async Task Main()
        {
            var httpClient = new HttpClient();
    
            // 第一次请求正常,有请求体
            var response1 = await httpClient.PostAsync("https://example.com/api/endpoint", new StringContent("request body"));
    
            // 将StringContent对象创建在每个请求内部,不立即释放
            using (var stringContent = new StringContent("request body"))
            {
                // 后续的请求也会有请求体
                var response2 = await httpClient.PostAsync("https://example.com/api/endpoint2", stringContent);
            }
        }
    }
    

    在修改后的代码中,我们使用using语句来创建StringContent对象,并在请求完成后自动释放资源。这样就可以保证每次请求都有正确的请求体。

    希望这个解决方案对你有帮助!


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^