c# - Flurl PostUrlEncoded 使用 GET 而不是 POST

标签 c# flurl

我一定错过了一些非常明显的东西,但我不知道是什么。我有一个 DoLoginAsync 像这样:

private async Task DoLoginAsync(bool force = false)
        {
            try
            {
                if (client.Cookies.ContainsKey("user_credentials") && !force)
                {
                    return;
                }
                var html = client.Request("login").GetStringAsync().Result;
                var doc = new HtmlDocument();
                doc.LoadHtml(html);
                var csrf_token = doc.DocumentNode.SelectNodes("//meta[@name='csrf-token']").First().GetAttributeValue("content", string.Empty);
                var values = new Dictionary<string, string>
                {
                    { "user_session[email]", user },
                    { "user_session[password]", password },
                    { "authenticity_token", csrf_token }
                };
                var result = await client.Request("user_session").PostUrlEncodedAsync(values);
            }
            catch (Exception e)
            {
            }

当我在 catch 子句中使用断点的测试中运行此代码时,出现异常

调用失败,状态代码 404(未找到):GET http://www.whatever.com/user_session

什么鬼?我期望 PostUrlEncodedAsync 执行 POST,而不是 GET。有人知道为什么会发生这种情况吗?

Flurl 客户端实例化为 client = new FlurlClient(BASE_URL).EnableCookies();

更新

尝试了以下测试,但由于相同的异常而失败

[TestMethod]
        public async Task TheTest()
        {
            var message = "";
            try
            {
                var client = new FlurlClient("http://www.slimmemeterportal.nl/").EnableCookies();
                var html = await client.Request("login").GetStringAsync();
                var doc = new HtmlDocument();
                doc.LoadHtml(html);
                var csrf_token = doc.DocumentNode.SelectNodes("//meta[@name='csrf-token']").First().GetAttributeValue("content", string.Empty);
                var values = new Dictionary<string, string>
                {
                    { "user_session[email]", "******" },
                    { "user_session[password]", "******" },
                    { "commit", "inloggen" }, // Not sure if this is actually needed, but it is in the website's request parameters.
                    { "authenticity_token", csrf_token }
                };
                var result = await client.Request("user_session").PostUrlEncodedAsync(values);
            }
            catch (FlurlHttpException ex)
            {
                message = ex.Message;
            }
            Assert.AreEqual("Call failed with status code 404 (Not Found): POST http://www.slimmemeterportal.nl/user_session", message);
        }

最佳答案

谜团已解:使用 Wireshark 进行一些调试后发现,该网站返回 HTTP 状态代码 301。如所解释的 here默认操作是使用 GET 跟踪响应位置 header 中的 URI,即使原始请求是 POST。

关于c# - Flurl PostUrlEncoded 使用 GET 而不是 POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52259616/

相关文章:

c# - MySQL SET PASSWORD 执行正常,有 0 行受影响,但不生效?

c# - 如何使用 C# 中的参数获取和设置 vb6 属性?

c# - 在 Visual Studio 2008 (C#) 中复制一个表单

c# - 如何在路径段中包含数字(散列)字符#?

c# - 从Flurl重播HttpCall

c# - 在 Microsoft Speech API 中指定单词的发音

c# - 处理 ViewModel 的模式?

c# - 如何在 Flurl 中使用代理进行 Web 请求?

flurl - 反序列化问题 GetJsonAsync<T> with Flurl