【问题标题】:httpClient.PostAsync() performs GET request anywayhttpClient.PostAsync() 无论如何都会执行 GET 请求
【发布时间】:2020-06-26 01:15:40
【问题描述】:

我真的不确定发生了什么。
我正在使用 HttpClient 使用 PostAsync 方法将 XML 内容发布到远程服务器,如下所示:

using var content = new StringContent(payload, Encoding.UTF8, "application/xml");
using var response = await _httpClient.PostAsync(string.Empty, content);

...其中payload是一个字符串,而相对uri是空的,因为我只需要调用httpclient的base uri。

我可以在 Postman 中执行相同的请求,并且效果很好。
问题是,由于某种原因,httpclient 实际上执行的是 GET 请求而不是 POST,并且忽略了任何内容:

我在 Postman 中检查过,这似乎是服务器对 GET 请求的正常响应。

我也试过

using var response = await _httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Post, string.Empty){Content = content});

...它给出了相同的结果。

这对我来说似乎是一个非常奇怪的问题,因为我过去从未见过 http 客户端有这样的行为。谁能解释一下为什么会这样?谢谢!

【问题讨论】:

  • 那么,你发送的是空内容,还是认证失败导致重定向后返回的HttpResponseMessage?
  • @Jimi 我传递给 PostAsync 的内容不为空,它有 220 字节的数据和标头。在我从收到的响应中查看请求消息后,内容为空,因为 GET 不能有内容。服务器响应任何 GET 都会放弃 400,所以我认为这不是身份验证问题。
  • @Jimi 是的,你是对的。服务器实际上将我重定向到同一页面,但这次使用 GET 请求。我不知道为什么会发生这种情况,或者为什么邮递员可以正常工作(我复制了所有标题)。谢谢,您可以发布答案,以便我验证
  • 嗯,我很高兴它有助于缩小问题范围(当然这种重定向将方法设置为GET),但我的评论并没有解决问题。当您首先确定导致问题的原因后,您应该(IMO)自己发布答案,否则只是单词

标签: c# .net http httpclient


【解决方案1】:

好的,所以问题实际上出在服务器上。

它将所有URL不以“/”结尾的请求,例如http://address.com/page重定向到相同的地址但以“/”结尾-http://address.com/page/,并丢失了正在处理的方法和内容。

正如@Jimi 提到的,HttpResponseMessage 中的 RequestMessage 字段包含有关到达服务器的最后一个请求的信息,因此初始请求数据丢失了,我误认为是 HttpClient 发出了错误的请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多