我用这种方式将字符串发布到网络服务器:
private async Task makeRequest(string url, string postData)
{
HttpClient client = null;
HttpResponseMessage response = null;
try
{
client = new HttpClient();
response = await client.PostAsync(url, new StringContent(postData));
response.EnsureSuccessStatusCode();
Debug.WriteLine(response.StatusCode + " " + response.ReasonPhrase);
}
catch (HttpRequestException e)
{
Debug.WriteLine(e.Message);
}
}
但是
response.EnsureSuccessStatusCode();
抛出了HttpRequestException
。当我对异常执行 e.Message
时,它显示:Response status code does not indicate success: 500 (Internal Server Error).
。
我做错了什么才会出现这个错误?我该如何纠正?
这里最好的解决方案,正如一位智者所说,HTTP 中没有魔法。
下载Fiddler2,在模拟器上设置代理以连接到它。然后使用
HttpWebRequest
运行代码,将标头保存在某处,然后使用 HttpClient
再次运行。
仔细比较两个文件并修复需要修复的内容。请注意,即使是最小的差异也可能很重要。
如果有人在使用 .net Standard 发送一切正确的数据时收到
500 (internal server error)
,请确保将 ExpectContinue
设置为 false
。
某些 API 不接受标头 Expect: 100-continue
,并发送 500 (internal server error)
作为响应。
我因此损失了一天。我必须使用Mockoon来查看环境日志和正在发送的内容。
private TItemType AddItem<TItemType>(TItemType item)
{
try
{
HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.ExpectContinue = false; // <-- Make sure it is false.
httpClient.Timeout = TimeSpan.FromSeconds(60);
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
var uri = new Uri("https://your.url/your/api");
var content = new System.Net.Http.StringContent(
JsonConvert.SerializeObject(item), Encoding.UTF8, "application/json");
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, uri);
request.Content = content;
HttpResponseMessage response = HttpClient.SendAsync(request).Result;
if (response.StatusCode == HttpStatusCode.Created)
{
string responseContent = response.Content.ReadAsStringAsync().Result;
return JsonConvert.DeserializeObject<TItemType>(responseContent);
}
return default;
}
catch (Exception)
{
throw;
}
}
POSTing StringContent 会将内容类型设置为
text/plain
。您可能会发现服务器不喜欢这样。尝试找出服务器期望的媒体类型并设置 Headers.ContentType
实例的 StringContent
。
HTTP 代码 500 表示您的服务器出现错误。简而言之,服务器在尝试处理此 POST 请求时抛出异常。
因此,此错误与
HttpClient
或您的 WP8
应用程序无关。
首先调试您的服务器并查看导致异常的原因,如果您遇到问题,请发布另一个问题。
我知道已经有一段时间了,但我偶然发现了这个问题,正在寻找一种使用
application/x-www-form-urlencoded
内容类型发送 POST 请求的方法。
Microsoft.Net.Http,从版本 2.2.28 开始,包含
FormUrlEncodedContent
类,允许您发送此类请求。
代码示例如下所示:
var client = new HttpClient();
var data = new Dictionary<String, String>
{
{ "firstname", "taj" },
{ "lastname", "burrow" }
};
var response = await client.PostAsync("http://mygreatapi.com", data);
对于好奇的人来说,
FormUrlEncodedContent
的构造函数需要一个IEnumerable<KeyValuePair<String, String>>
我的程序
在dotNetFramwork4.8.1上运行ASP.NET WEB API2
即使发送正确的数据,我也收到 500(内部服务器错误)。
将 ExpectContinue 设置为 False 解决了我的问题!
HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.ExpectContinue = false;
或者你可以将全局 ExpectContinue 设置为 false
ServicePointManager.Expect100Continue = false;
最后感谢这个对我有帮助的回复 https://stackoverflow.com/a/68591338/19891718