【问题标题】:Add cookie with multiple values using OWIN ResponseCookieCollection class使用 OWIN ResponseCookieCollection 类添加具有多个值的 cookie
【发布时间】:2017-04-06 03:07:01
【问题描述】:

我需要使用 OWIN API 来设置具有多个值的 cookie。

这可以使用HttpCookie 类来完成,如下所示:

var cookie = new HttpCookie("MyCookie");
cookie ["CustomField1"] = HttpUtility.UrlEncode(customValue1);
cookie ["CustomField2"] = HttpUtility.UrlEncode(customValue2);
this._httpContext.Response.Cookies.Set(cookie);

如何使用 OWIN ResponseCookieCollection 类创建此 cookie?

https://msdn.microsoft.com/en-us/library/microsoft.owin.responsecookiecollection(v=vs.113).aspx

这个类有一个Append 方法来添加一个新的cookie 和值,但是不清楚如何添加一个具有多个值的cookie。任何帮助将不胜感激。

【问题讨论】:

  • collection.Append("MyCookie", $"CustomField1={HttpUtility.UrlEncode(customValue1)}&CustomField2={HttpUtility.UrlEncode(customValue2)}");
  • 感谢@Romoku 的回复。我认为您的示例会导致 cookie 具有单个值。在 Fiddler 的 Headers 选项卡中查看 cookie 时,它​​显示在一行中,而使用 HttpCookie 类创建的 cookie 显示在 Fiddler 中,每个值都在单独的行中。也许是因为使用 ResponseCookieCollection 类会导致等号和 & 字符的 url 编码,但我看不到任何阻止它被 url 编码的选项。
  • 看起来 ResponseCookieCollection 正在对值进行编码。如果需要,您可以直接写入标题。

标签: c# asp.net cookies owin


【解决方案1】:

原来ResponseCookieCollection 类在Append 方法中编码值。

这可以通过将多值 cookie 直接添加到 IHeaderDictionary 来解决。

代码:

public static class HeaderExtensions
{
    public static void SetMultiValuedCookie(
        this IHeaderDictionary headers,
        string key,
        params KeyValuePair<string, string>[] values)
    {
        if (string.IsNullOrWhiteSpace(key))
        {
            throw new ArgumentNullException(nameof(key));
        }

        if (values == null)
        {
            throw new ArgumentNullException(nameof(values));
        }

        if (0 >= values.Length)
        {
            throw new ArgumentOutOfRangeException(nameof(values));
        }

        var value = string.Join("&", values.Select(v => $"{Uri.EscapeDataString(v.Key)}={Uri.EscapeDataString(v.Value)}"));

        headers.AppendValues("Set-Cookie", Uri.EscapeDataString(key) + "=" + value + "; path=/");
    }
}

测试:

var headers = new HeaderDictionary(new Dictionary<string, string[]>());

var values = new[]
{
    new KeyValuePair<string, string>("CustomField1", "1"),
    new KeyValuePair<string, string>("CustomField2", "2"),
};

headers.SetMultiValuedCookie("MyCookie", values);
headers.SetMultiValuedCookie("MyCookie2", values);

结果:

【讨论】:

  • 非常感谢!工作一种享受!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 2014-04-10
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
  • 2012-10-22
  • 2016-09-11
相关资源
最近更新 更多