C# 使用OWIN ResponseCookieCollection类添加具有多个值的cookie

C# 使用OWIN ResponseCookieCollection类添加具有多个值的cookie,c#,asp.net,cookies,owin,C#,Asp.net,Cookies,Owin,我需要使用OWIN API设置一个具有多个值的cookie 这可以使用HttpCookie类完成,如下所示: var cookie = new HttpCookie("MyCookie"); cookie ["CustomField1"] = HttpUtility.UrlEncode(customValue1); cookie ["CustomField2"] = HttpUtility.UrlEncode(customValue2); this._httpContext.Response.C

我需要使用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


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

事实证明,
ResponseCookieCollection
类对
Append
方法中的值进行编码

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

代码:

公共静态类标题扩展
{
公共静态无效集多值okie(
这是我的标题,
字符串键,
参数KeyValuePair[]值)
{
if(string.IsNullOrWhiteSpace(key))
{
抛出新ArgumentNullException(nameof(key));
}
如果(值==null)
{
抛出新ArgumentNullException(nameof(values));
}
如果(0>=values.Length)
{
抛出新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=newheaderdictionary(newdictionary());
var值=新[]
{
新的KeyValuePair(“CustomField1”、“1”),
新的KeyValuePair(“CustomField2”、“2”),
};
headers.SetMultiValuedCookie(“myookie”,值);
headers.SetMultiValuedCookie(“myookie2”,值);
结果:


collection.Append(“mycokie”、$“CustomField1={HttpUtility.UrlEncode(customValue1)}&CustomField2={HttpUtility.UrlEncode(customValue2)}”)感谢@Romoku的回复。我认为您的示例生成了一个具有单个值的cookie。在Fiddler的Headers选项卡中查看cookie时,它显示在一行上,而使用
HttpCookie
类创建的cookie显示在Fiddler中,每个值都显示在单独的行上。可能是因为使用
ResponseCookieCollection
类会导致等号和符号以及字符的url编码,但我看不到任何选项可以阻止它被url编码。看起来
ResponseCookieCollection
正在对值进行编码。如果需要,您可以直接写入标题。非常感谢!真是一种享受!
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);