【发布时间】:2022-04-29 01:07:03
【问题描述】:
我正在使用 HttpClient 向外部 API 发送 POST 请求,并且我知道我正在发送正确的有效负载和标头以及所有内容,因为它有时可以工作,但有时它会返回一个空字符串响应。它总是返回 200 状态码。将其更改为异步不是一种选择,所以我的问题是,我如何同步运行并可靠地获得响应?
这是我在我的应用程序的许多其他地方用于 GET 和 POST 的方法,并且每次都可以正常工作:
HttpClient client = new HttpClient { BaseAddress = new Uri("url")
client.DefaultRequestHeaders.Add("X-Authorization", "Bearer " + authToken);
var input = new {json object};
var serializerSettings = new JsonSerializerSettings();
serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
var json = JsonConvert.SerializeObject(input, serializerSettings);
var data = new StringContent(json, Encoding.UTF8, "application/json");
var result = client.PostAsync("api/Create", data).Result;
if (result.IsSuccessStatusCode)
{
var jsonStringResult = result.Content.ReadAsStringAsync().Result;
var response = JsonConvert.DeserializeObject<ApiResponse>(jsonStringResult);
// response is null....sometimes
}
我从其他论坛帖子和博客中尝试过的其他方法:
var postTask = client.PostAsync("api/Create", data);
postTask.Wait();
var result = postTask.Result;
if (result.IsSuccessStatusCode)
{
var jsonTask = result.Content.ReadAsStringAsync();
jsonTask.Wait();
var jsonStringResult = jsonTask.Result;
var response = JsonConvert.DeserializeObject<ApiResponse>(jsonStringResult);
// response is null....sometimes
}
和
var result = client.PostAsync("api/Create", data).GetAwaiter().GetResult();
if (result.IsSuccessStatusCode)
{
var jsonStringResult = result.Content.ReadAsStringAsync().GetAwaiter().GetResult();
var response = JsonConvert.DeserializeObject<ApiResponse>(jsonStringResult);
// response is null....sometimes
}
和
byte[] byteArray = Encoding.UTF8.GetBytes(json);
var request = (HttpWebRequest)WebRequest.Create("url");
request.Method = "POST";
request.ContentType = "application/json; charset=UTF-8";
request.Accept = "application/json";
request.ContentLength = byteArray.Length;
request.Headers.Add("X-Authorization", "Bearer" + authToken);
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
WebResponse response = request.GetResponse();
dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string responseFromServer = reader.ReadToEnd();
dataStream.Close();
response.Close();
var responseObj = JsonConvert.DeserializeObject<ApiResponse>(responseFromServer);
// resonseObj is null...sometimes
所有四种方法在某些时候都有效,但我需要它更可靠。死锁目前不是问题。 任何帮助表示赞赏!
【问题讨论】:
-
我建议您使用 Fiddler(或其他一些网络跟踪工具)来确认正文是从服务器返回的。您的客户可能没有任何问题。
-
为什么不能选择异步?
-
它是一个 Windows 窗体应用程序,可与微控制器通信并按特定顺序执行一系列操作。为了让一切正常工作需要付出很多努力。我尝试异步运行这部分,它把其他所有东西都扔了,但仍然没有比上面的其他方法更好。
-
我遇到了一个非常相似的问题。就我而言,代码运行可靠,并且当它在各种 Windows 10 机器上运行时我得到了正确的响应,但在 Windows Server 上运行时大部分时间都失败了。你有解决它的进展吗?
-
@Avi 在 Windows 服务器上运行成功了吗?经过多少次尝试失败?
标签: .net httpclient