C# HttpClient PostAsJson发送GET请求而非POST请求

9

我正在使用HttpClient进行POST请求,但是收到了405方法不被允许的错误。在Fiddler中捕获跟踪时,它以GET而不是POST方式发送出去!

using (var client = new HttpClient())
            {
                var url = AppSettingsUtil.GetString("url");
                var response = client.PostAsJsonAsync(url, transaction).Result;
            }

我知道async/await的问题。这个示例是为了展示问题而简化的。

是否有一些web.config或machine.config的设置可能会影响到这个问题?其他通过RestSharp发送的请求可以正确地发送POST。

以下是Fiddler捕获的内容。在Fiddler中重新运行跟踪也会返回405(如预期的那样)。手动将其切换为POST并从Fiddler中运行可以正常工作。

此外,也许因为方法被切换为GET,Fiddler中没有捕获到body,在Fiddler中必须手动粘贴JSON。

GET /*URL*/ HTTP/1.1
Content-Type: application/json; charset=utf-8
Host: /*host*/
Connection: Keep-Alive

可能是一个错误,根据这个线程 https://dev59.com/MVrUa4cB1Zd3GeqPjWNA - Nikki9696
1
当我的URL没有以“/”结尾时,我会收到这个错误。 - Piotr Perak
我的URL没有以/结尾,这也是@PiotrPerak的情况。 - Stepo
2个回答

8
问题似乎是有人在未告知我们的情况下更改了URL,并设置了重定向。HttpClient响应重定向,但最终实际上将请求作为Get发送到了最终目的地。
对我来说,这似乎是HttpClient的一个错误,它应该将最终请求作为Post发送,或者抛出异常说它不能执行我要求的操作。
请参见使用JAX-RS转发另一台服务器的响应

是的,可能是一个 bug。https://dev59.com/MVrUa4cB1Zd3GeqPjWNA 如果在请求除 GET 或 HEAD 以外的其他请求中收到 302 状态码作为响应,则用户代理必须不自动重定向请求,除非可以得到用户的确认,因为这可能会改变发出请求的条件。 - Nikki9696
4
结果发现这也是我的问题。重写一个旧应用程序时,尽管新服务器采用https://,但仍然会连接到http://服务器,并且会被重定向到安全网站的非安全连接。 - Brad Moore
3
我遇到了与@Brad Moore提到的相同问题。在Azure中,我们启用了一个安全设置,要求所有的URL调用都使用https://。其中一个旧的调用仍然对一个http://端点进行POST,并记录了一个“方法不允许”的错误,指出该调用是一个GET,这是误导性的。 - PoorInRichfield

1
在我的情况下(Golang服务器),请求的URI中有双斜杠,而Golang服务器将重定向到URI的单斜杠版本。令人费解的是,HttpClient 使用重定向后的URI 上的GET,而不是原始的POST
例如,我错误地请求了https://example.com//foo,然后服务器将我重定向到https://example.com/foo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接