gpt4 book ai didi

c# - Cookie 和 C# HttpWebRequest

转载 作者:可可西里 更新时间:2023-11-01 16:20:21 24 4
gpt4 key购买 nike

我一直在尝试登录到服务器以获取身份验证 cookie( session cookie),然后我可以将其用于对服务器的进一步调用。我读过的每个例子都遵循相同的模式:

HttpWebRequest request = WebRequest.Create(loginURL) as HttpWebRequest;
var response = request.GetResponse() as HttpWebResponse;

var cookies = response.Cookies;

这对我不起作用,因为 cookies 变量最终为空,调试分析显示 response.Cookies 为空。服务器是我的,我通过调试可以看到正在设置cookie。如果我用它登录到我的网站,我也可以在 Firefox 中看到 cookie。所以我知道正在设置 cookie。

经过一番摸索,我发现 cookie 是在请求 中设置的,而不是在响应中。所以下面的代码有效。我的问题是:为什么?为什么填充请求而不是响应?这与成为职位有关,而不是获得吗?我完全感到困惑。

    private void Login()
{
string userName = UserNameText.Text;
string password = PasswordText.Password;
string baseURL = URLText.Text;

string loginURL = baseURL + "/Authentication/LoginAction";

HttpWebRequest request = WebRequest.Create(loginURL) as HttpWebRequest;
request.Method = "POST";

string formContent =
"UserName=" + userName +
"&Password=" + password;

var byteArray = Encoding.UTF8.GetBytes(formContent);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;
request.CookieContainer = new CookieContainer();

try
{
using (var dataStream = request.GetRequestStream())
{

dataStream.Write(byteArray, 0, byteArray.Length);

using (var response = request.GetResponse() as HttpWebResponse)
{
var cookies = request.CookieContainer;

if (cookies.Count != 0)
{
cookies_ = cookies;
}
}
}
}
catch(Exception ex)
{
// don't bother too much
Debug.WriteLine(ex.Message);
}
}

最佳答案

CookieContainer 应被视为类似于特定站点的浏览器 cookie 缓存。这个想法是您提供容器作为请求的一部分,然后它由您收到的 cookie 填充,您可以为后续请求重用该容器。当您发出请求时,容器中的 cookie 会随请求一起发送(就像浏览器会使用存储的 cookie 一样)。

因此,例如,如果您有一个使用 cookie 来存储身份验证 token 的页面,您可以将 cookie 容器与登录请求一起传递,然后将其与需要经过身份验证的 cookie 的后续请求一起传递。

至于为什么你不能简单地从请求中提取它,我猜 Microsoft 只是不想在你可以在请求中传递对可变 cookie 容器的引用时复制东西。

关于c# - Cookie 和 C# HttpWebRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50867864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com