在使用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)
问题原因: 在这段代码中,问题出现在第二次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
对象,并在请求完成后自动释放资源。这样就可以保证每次请求都有正确的请求体。
希望这个解决方案对你有帮助!