在完整的 .NET 框架中,我们支持多值 cookie。例如一个 cookie 可以有多个值:
HttpCookie aCookie = new HttpCookie("userInfo");
aCookie.Values["userName"] = "patrick";
aCookie.Values["lastVisit"] = DateTime.Now.ToString();
另见 the docs about HttpCookie.Values
on MSDN和 ASP.NET Cookies Overview on MSDN .
在 ASP.NET Core 中,多值 cookie 似乎消失了。没有 HttpCookie.Values
和 HttpRequest.Cookies
返回 IRequestCookieCollection
这就像一个从 string
到 string
dictionary
我现在应该如何在 ASP.NET Core 中创建和读取多值 cookie?我如何读取在 Full ASP.NET 中创建的多值 cookie 并在 ASP.NET Core 中读取它们?
最佳答案
我相信 ASP.NET Core 删除了对旧的遗留多值 cookie 的支持,因为此功能从未标准化。
RFC definition for cookies明确声明使用 Set-Cookie
header 您可以分配单个名称/值对,并可选地关联元数据。
.NET HttpCookie
的 Values
属性的官方实现非常脆弱,只是将键值对序列化/反序列化为带有分隔符的字符串,或者从字符串中序列化/反序列化 &
用于对,=
用于值。
在 ASP.NET Core 中模拟这种行为应该相当容易,您可以使用扩展方法来处理那些遗留格式的 cookie:
public static class LegacyCookieExtensions
{
public static IDictionary<string, string> FromLegacyCookieString(this string legacyCookie)
{
return legacyCookie.Split('&').Select(s => s.Split('=')).ToDictionary(kvp => kvp[0], kvp => kvp[1]);
}
public static string ToLegacyCookieString(this IDictionary<string, string> dict)
{
return string.Join("&", dict.Select(kvp => string.Join("=", kvp.Key, kvp.Value)));
}
}
像这样使用它们:
// read the cookie
var legacyCookie = Request.Cookies["userInfo"].FromLegacyCookieString();
var username = legacyCookie["userName"];
// write the cookie
var kvpCookie = new Dictionary<string, string>()
{
{ "userName", "patrick" },
{ "lastVisit", DateTime.Now.ToString() }
};
Response.Cookies.Append("userInfo", kvpCookie.ToLegacyCookieString());
演示:https://dotnetfiddle.net/7KrJ5S
如果您需要更复杂的序列化/反序列化逻辑(处理格式错误和转义 cookie 值中的字符),您应该从 Mono HttpCookie implementation 中查找并获取一些代码,我相信它更强大一些。
关于c# - 如何在 ASP.NET Core 中处理多值 cookie?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43701126/