c# - 将 header cookie 字符串映射到 CookieCollection,反之亦然

标签 c# cookies http-headers

考虑带有此 header 的网络响应:

Set-Cookie: sample=testCookie; Domain=.sample.com; Expires=Tue, 25-Jan-2012 00:49:29 GMT; Path=/

此 header 将映射到 .NET 中的 CookieCollection。而且当我们处理一个 CookieCollection 时,它最终会转换成这样一个 header string

我正在寻找某种方法来纯粹以两种方式进行这种转换。 .NET 肯定在它的内部库中有它。我相信任何从文本构建对象模型的类都应该支持两种方法(这里是 CookieCollection):

// Creating cookie collection from header text
CookieCollection.TryParse(cookieHeaderString, out myCookieCollection);
// and getting the final header which would be sent by request
String cookieHeaderString = myCookieCollection.GetCookieHeaderString();

如何使用 CookieCollection 实现这一点?

最佳答案

我知道这已经得到解答,但您可能想使用以下代码: http://snipplr.com/view/4427/

我把它贴在这里以防链接在某个时候失效:

public static CookieCollection GetAllCookiesFromHeader(string strHeader, string strHost)
{
    ArrayList al = new ArrayList();
    CookieCollection cc = new CookieCollection();
    if (strHeader != string.Empty)
    {
        al = ConvertCookieHeaderToArrayList(strHeader);
        cc = ConvertCookieArraysToCookieCollection(al, strHost);
    }
    return cc;
}


private static ArrayList ConvertCookieHeaderToArrayList(string strCookHeader)
{
    strCookHeader = strCookHeader.Replace("\r", "");
    strCookHeader = strCookHeader.Replace("\n", "");
    string[] strCookTemp = strCookHeader.Split(',');
    ArrayList al = new ArrayList();
    int i = 0;
    int n = strCookTemp.Length;
    while (i < n)
    {
        if (strCookTemp[i].IndexOf("expires=", StringComparison.OrdinalIgnoreCase) > 0)
        {
            al.Add(strCookTemp[i] + "," + strCookTemp[i + 1]);
            i = i + 1;
        }
        else
        {
            al.Add(strCookTemp[i]);
        }
        i = i + 1;
    }
    return al;
}


private static CookieCollection ConvertCookieArraysToCookieCollection(ArrayList al, string strHost)
{
    CookieCollection cc = new CookieCollection();

    int alcount = al.Count;
    string strEachCook;
    string[] strEachCookParts;
    for (int i = 0; i < alcount; i++)
    {
        strEachCook = al[i].ToString();
        strEachCookParts = strEachCook.Split(';');
        int intEachCookPartsCount = strEachCookParts.Length;
        string strCNameAndCValue = string.Empty;
        string strPNameAndPValue = string.Empty;
        string strDNameAndDValue = string.Empty;
        string[] NameValuePairTemp;
        Cookie cookTemp = new Cookie();

        for (int j = 0; j < intEachCookPartsCount; j++)
        {
            if (j == 0)
            {
                strCNameAndCValue = strEachCookParts[j];
                if (strCNameAndCValue != string.Empty)
                {
                    int firstEqual = strCNameAndCValue.IndexOf("=");
                    string firstName = strCNameAndCValue.Substring(0, firstEqual);
                    string allValue = strCNameAndCValue.Substring(firstEqual + 1, strCNameAndCValue.Length - (firstEqual + 1));
                    cookTemp.Name = firstName;
                    cookTemp.Value = allValue;
                }
                continue;
            }
            if (strEachCookParts[j].IndexOf("path", StringComparison.OrdinalIgnoreCase) >= 0)
            {
                strPNameAndPValue = strEachCookParts[j];
                if (strPNameAndPValue != string.Empty)
                {
                    NameValuePairTemp = strPNameAndPValue.Split('=');
                    if (NameValuePairTemp[1] != string.Empty)
                    {
                        cookTemp.Path = NameValuePairTemp[1];
                    }
                    else
                    {
                        cookTemp.Path = "/";
                    }
                }
                continue;
            }

            if (strEachCookParts[j].IndexOf("domain", StringComparison.OrdinalIgnoreCase) >= 0)
            {
                strDNameAndDValue = strEachCookParts[j];
                if (strDNameAndDValue != string.Empty)
                {
                    NameValuePairTemp = strDNameAndDValue.Split('=');

                    if (NameValuePairTemp[1] != string.Empty)
                    {
                        cookTemp.Domain = NameValuePairTemp[1];
                    }
                    else
                    {
                        cookTemp.Domain = strHost;
                    }
                }
                continue;
            }
        }

        if (cookTemp.Path == string.Empty)
        {
            cookTemp.Path = "/";
        }
        if (cookTemp.Domain == string.Empty)
        {
            cookTemp.Domain = strHost;
        }
        cc.Add(cookTemp);
    }
    return cc;
}

此代码将读取以逗号分隔的 cookie,并正确解析每个 cookie 的所有部分,包括名称、过期时间、路径、值和域。

关于c# - 将 header cookie 字符串映射到 CookieCollection,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4792638/

相关文章:

c# - 如何使用 MigraDoc 添加书签?

c# - 使用 .NET 图像转换是否足够?

PHP Cookies 在本地主机上运行良好,但在实时服务器上不起作用

javascript - IndexedDb 是否依赖于 cookie?

asp-classic - 如何访问Http请求中的响应头

c# - 库升级到 .net 标准 2.1

javascript - golang api 请求在浏览器中有效,但在从本地运行的 JavaScript 请求时返回 401(未经授权)

javascript - 如何访问 Javascript 中的 Websocket 响应 header ?

objective-c - NSMutableURLRequest 自定义 header 导致请求失败

c# - C# windows 应用程序可以在基于 windows 8 的平板电脑上运行吗?