Cookie Header 在执行 GET 调用时未通过
Cookie Header Not Going Through In The Execution of GET Call
前言:
- 这是我为多个通信设备构建控制 GUI 的个人项目的一部分 - 不幸的是使用 WinForms。
- 有问题的代码 运行 部分在表单的构造函数中。
- 已安装的其他 NuGet 包有:Newtonsoft.Json、RestSharp、SpecFlow 和 SpecFlow.Assist.Dynamic。
- LoginForm 和 SeatsInfo 是两个基本的 类 创建只是为了存储和组织我的数据,他们没有额外的编码除了属性声明。
执行代码:
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 中的实际数据包视图:
每次授权成功连接设备都会生成sids,明显不同
我预期视图的屏幕截图取自普通控制台应用程序中完全相同的代码块。那里一切正常。这两个程序上安装的所有 NuGet 包都是相同版本的,我什至 运行 他们 side-by-side 但没有帮助。
调试屏幕截图显示参数确实包含 Cookie header:
header 由于某种原因没有通过。很想听听关于这个问题的一些想法,非常感谢!
目前的解决方案,只需添加另一个AddCookie()方法:
seatAvailRequest.AddHeader("sid", sessionID.ToString());
seatAvailRequest.AddHeader("Cookie","sid = " + sessionID.ToString());
seatAvailRequest.AddCookie("sid", sessionID.ToString());
这在某种程度上不适用于 AddCookie() 或 AddHeader(),所以现在他们都进入了。希望这对某人有所帮助,并感谢大家阅读!
所以,回顾一下,我在 API 调用中缺少 Cookie Header,因此导致调用失败(设备未授权它)。
在使用 AddCookie() 方法之后,特别是:
seatAvailRequest.AddCookie("sid", sessionID.ToString());
设备给了我一个不同的错误 - 404 Not Found,之前是 401 Unauthorized:
最后我愚蠢的头脑使用了 AddCookie() 和 AddHeader() 和 voilà:
有效!只有经过 5 个小时的痛苦调试和 mind-numbing 搜索。新包虽然大了点,但我暂时不用担心这个,现实来说以后也不用担心。
感谢大家一直以来的关注,欢迎大家提出建议和改进!
前言:
- 这是我为多个通信设备构建控制 GUI 的个人项目的一部分 - 不幸的是使用 WinForms。
- 有问题的代码 运行 部分在表单的构造函数中。
- 已安装的其他 NuGet 包有:Newtonsoft.Json、RestSharp、SpecFlow 和 SpecFlow.Assist.Dynamic。
- LoginForm 和 SeatsInfo 是两个基本的 类 创建只是为了存储和组织我的数据,他们没有额外的编码除了属性声明。
执行代码:
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 中的实际数据包视图:
每次授权成功连接设备都会生成sids,明显不同
我预期视图的屏幕截图取自普通控制台应用程序中完全相同的代码块。那里一切正常。这两个程序上安装的所有 NuGet 包都是相同版本的,我什至 运行 他们 side-by-side 但没有帮助。
调试屏幕截图显示参数确实包含 Cookie header:
header 由于某种原因没有通过。很想听听关于这个问题的一些想法,非常感谢!
目前的解决方案,只需添加另一个AddCookie()方法:
seatAvailRequest.AddHeader("sid", sessionID.ToString());
seatAvailRequest.AddHeader("Cookie","sid = " + sessionID.ToString());
seatAvailRequest.AddCookie("sid", sessionID.ToString());
这在某种程度上不适用于 AddCookie() 或 AddHeader(),所以现在他们都进入了。希望这对某人有所帮助,并感谢大家阅读!
所以,回顾一下,我在 API 调用中缺少 Cookie Header,因此导致调用失败(设备未授权它)。
在使用 AddCookie() 方法之后,特别是:
seatAvailRequest.AddCookie("sid", sessionID.ToString());
设备给了我一个不同的错误 - 404 Not Found,之前是 401 Unauthorized:
最后我愚蠢的头脑使用了 AddCookie() 和 AddHeader() 和 voilà:
有效!只有经过 5 个小时的痛苦调试和 mind-numbing 搜索。新包虽然大了点,但我暂时不用担心这个,现实来说以后也不用担心。
感谢大家一直以来的关注,欢迎大家提出建议和改进!