5

我以这种方式将字符串发布到 Web 服务器:

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

我做错了什么,我得到了那个错误?我该如何纠正?

4

5 回答 5

4

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

下载Fiddler2,在模拟器上设置一个代理来连接它。然后运行您的代码,HttpWebRequest将标头保存在某处,然后使用HttpClient.

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

于 2013-09-07T18:28:43.983 回答
2

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

于 2013-09-07T17:28:00.400 回答
2

如果有人在500 (internal server error)使用 .net Standard 发送数据时一切正常,请确保 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;
    }
}
于 2021-07-30T12:57:11.270 回答
1

HTTP 代码 500 表示这是您的服务器上的错误。简单来说,服务器在尝试处理这个 POST 请求时抛出了异常。

因此,此错误与您的应用无关,也HttpClient与您的WP8应用无关。

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

于 2013-09-07T14:34:11.060 回答
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>>

于 2014-09-09T16:01:14.707 回答