在 Windows Phone 8 中使用 HttpClient 执行 POST 时出现内部服务器错误

问题描述 投票:0回答:6

我用这种方式将字符串发布到网络服务器:

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).

我做错了什么才会出现这个错误?我该如何纠正?

c# windows-phone-8 internal-server-error dotnet-httpclient asynchttpclient
6个回答
5
投票

这里最好的解决方案,正如一位智者所说,HTTP 中没有魔法。

下载Fiddler2,在模拟器上设置代理以连接到它。然后使用

HttpWebRequest
运行代码,将标头保存在某处,然后使用
HttpClient
再次运行。

仔细比较两个文件并修复需要修复的内容。请注意,即使是最小的差异也可能很重要。


5
投票

如果有人在使用 .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;
    }
}

2
投票

POSTing StringContent 会将内容类型设置为

text/plain
。您可能会发现服务器不喜欢这样。尝试找出服务器期望的媒体类型并设置
Headers.ContentType
实例的
StringContent


1
投票

HTTP 代码 500 表示您的服务器出现错误。简而言之,服务器在尝试处理此 POST 请求时抛出异常。

因此,此错误与

HttpClient
或您的
WP8
应用程序无关。

首先调试您的服务器并查看导致异常的原因,如果您遇到问题,请发布另一个问题。


1
投票

我知道已经有一段时间了,但我偶然发现了这个问题,正在寻找一种使用

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>>


0
投票

我的程序

ASP.NET WEB API2
在dotNetFramwork4.8.1上运行

即使发送正确的数据,我也收到 500(内部服务器错误)。

将 ExpectContinue 设置为 False 解决了我的问题!

HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.ExpectContinue = false; 

或者你可以将全局 ExpectContinue 设置为 false

ServicePointManager.Expect100Continue = false;

最后感谢这个对我有帮助的回复 https://stackoverflow.com/a/68591338/19891718

© www.soinside.com 2019 - 2024. All rights reserved.