c# - 通过 HttpListenerResponse 向客户端 Web 浏览器添加多个 cookie
问题描述
我正在尝试通过我的响应向客户端 Web 浏览器添加多个 cookie。
首先,我使用 System.Net.HttpListenerResponse.SetCookie 方法将多个 cookie 对象添加到标头,然后发回响应。根据文档,此方法“在随此响应发送的 cookie 集合中添加或更新 cookie”。
当我查看浏览器开发人员工具中的 cookie 时,我看到只添加了一个 cookie。我的第二个 cookie 名称和值似乎被附加到我的第一个 cookie 的值上。
我编写了一个简单的控制台应用程序来演示该行为,您只需将“127.0.0.1 website.test.com”添加到您的主机文件中,URL 就会解析。
using System.Net;
using System.IO;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
using (HttpListener listener = new HttpListener())
{
listener.Prefixes.Add(@"http://website.test.com/cookies/");
listener.Start();
HttpListenerContext context = listener.GetContext(); //Waits for an incoming request
HttpListenerRequest request = context.Request;
HttpListenerResponse response = context.Response;
response.SetCookie(new Cookie("name1", "value1"));
response.SetCookie(new Cookie("name2", "value2"));
response.StatusCode = (int)HttpStatusCode.OK;
Stream responseStream = response.OutputStream;
StreamWriter writer = new StreamWriter(responseStream);
writer.Write("");
response.Close();
}
}
}
}
我还尝试在值的末尾添加分号。这纠正了我的第二个 cookie 被附加到我的第一个 cookie 值但客户端中仍然只有一个 cookie 的问题。
解决方案
HttpListenerResponse 将所有 cookie 折叠到单个 Set-Cookie 标头中:
HTTP/1.1 200 OK
Server: Microsoft-HTTPAPI/2.0
Set-Cookie: name1=value1, name2=value2
现代浏览器会忽略折叠的 cookie。详细信息在这里:是否可以使用单个 Set-Cookie 设置多个 cookie?
每个 cookie 都应该在一个单独的标题中:
HTTP/1.1 200 OK
Server: Microsoft-HTTPAPI/2.0
Set-Cookie: name1=value1
Set-Cookie: name2=value2
将 cookie 作为标头添加到 HttpListenerResponse 以获得所需的响应:
static void Main(string[] args)
{
using (HttpListener listener = new HttpListener())
{
listener.Prefixes.Add(@"http://website.test.com/cookies/");
listener.Start();
HttpListenerContext context = listener.GetContext();
HttpListenerResponse response = context.Response;
response.StatusCode = (int)HttpStatusCode.OK;
response.AddHeader("Set-Cookie", "name1=value1");
response.AppendHeader("Set-Cookie", "name2=value2");
response.Close();
}
}
推荐阅读
- java - 如何在android中过滤自定义ListView
- protractor - 使用 chrome 访客模式启动量角器
- c++ - 使蒙版外全部透明
- python - 如何矢量化循环遍历 3D 点数组的 Python 函数?
- ios - 不在摄像机视野内时停止 SKVideoNode 播放
- laravel - barryvdh/laravel-cors 配置在 Laravel 5.6 中不起作用;忽略'allowedMethods'
- html - 我如何在 Bootstrap 中强制图像粘贴到它下面的 div 直到 768px
- javascript - Ionic 3 中的 CORS 地狱
- ruby-on-rails - Rails 应用程序中的语言没有改变
- c# - WPF 应用程序在启动时崩溃 - 事件查看器日志中的 .NET 运行时错误事件 ID 1026