【问题标题】:Cookie Header Not Going Through In The Execution of GET Call执行 GET 调用时未通过 Cookie 标头
【发布时间】:2021-04-15 15:57:01
【问题描述】:

前言:

  • 这是我为多个通信设备构建控制 GUI 的个人项目的一部分 - 不幸的是使用 WinForms。
  • 遇到问题的代码部分位于表单的构造函数中。
  • 安装的其他 NuGet 包有:Newtonsoft.Json、RestSharp、SpecFlow 和 SpecFlow.Assist.Dynamic。
  • LoginFormSeatsInfo 是为存储和组织我的数据而创建的两个基本类,除了属性声明之外,它们没有额外的编码。

执行代码:

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RestSharp;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CONTROL_UI
{
    public partial class RunningConfig : Form
    {
        public RunningConfig()
        {
            InitializeComponent();

            var client = new RestClient("CLIENT_URL");
            var loginRequest = new RestRequest("api/login", Method.POST);

            loginRequest.RequestFormat = DataFormat.Json;
            loginRequest.AddHeader("Content-type", "application/json");
            loginRequest.AddJsonBody(new LoginForm() { username = "admin", password = "", @override = true });

            var loginRespone = client.Execute(loginRequest);

            JObject sessionInfo = JObject.Parse(loginRespone.Content);

            var sessionID = sessionInfo["sid"];

            var seatAvailRequest = new RestRequest("api/seats", Method.GET);

            seatAvailRequest.AddHeader("sid", sessionID.ToString());
            seatAvailRequest.AddHeader("Cookie", "sid = " + sessionID.ToString());

            var seatResponse = client.Execute(seatAvailRequest);

            List<SeatsInfo> seatsInfo = JsonConvert.DeserializeObject<List<SeatsInfo>>(seatResponse.Content);

            //Further Implementation
        }
    }
}

WireShark 中的预期数据包视图:

WireShark 中的实际数据包视图:

每次我成功授权连接到设备时都会生成sid,因此它们显然不同。

我预期视图的屏幕截图取自普通控制台应用程序中完全相同的代码块。那里一切正常。这两个程序上安装的所有 NuGet 包都是相同的版本,我什至尝试并排运行它们,但没有帮助。

调试屏幕截图显示,Parameters 确实包含 Cookie 标头:

标题由于某种原因没有通过。很想听听关于这个问题的一些想法,非常感谢!

目前的解决方案,只需添加另一个 AddCookie() 方法:

            seatAvailRequest.AddHeader("sid", sessionID.ToString());
            seatAvailRequest.AddHeader("Cookie","sid = " + sessionID.ToString());
            seatAvailRequest.AddCookie("sid", sessionID.ToString());

这在某种程度上不适用于仅 AddCookie() 或 AddHeader(),所以现在他们都进入了。希望这对某人有所帮助,感谢大家的阅读!

【问题讨论】:

  • @mjwills 感谢您的帖子链接。虽然我确实经历了那个,但不幸的是没有帮助。但我终于设法弄清楚了,并且已经在下面发表了评论。干杯!

标签: c# restsharp rest


【解决方案1】:

因此,回顾一下,我在 API 调用中缺少 Cookie 标头,因此导致调用不成功(设备未授权它)。

在弄乱了 AddCookie() 方法之后,特别是:

    seatAvailRequest.AddCookie("sid", sessionID.ToString());

设备给了我一个不同的错误 - 404 Not Found,之前是 401 Unauthorized:

最后,我愚蠢的头脑同时使用了 AddCookie() 以及 AddHeader() 和瞧:

有效!经过 5 小时痛苦的调试和令人麻木的搜索之后。虽然新的数据包有点大,但我现在不用担心,或者将来现实地说。

感谢大家的关注,仍然欢迎提出建议和改进!

【讨论】:

    猜你喜欢
    • 2020-12-13
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 2017-12-08
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多