多次添加HTTP标头,并使用HttpWebRequest单独发送

时间:2011-12-13 10:29:44

标签: asp.net .net http cookies .net-4.0

我需要使用Set-Cookie类发送超过HttpWebRequest HTTP标头。

问题首先request.Headers.Add("Set-Cookie", "[cookie string]")按预期添加标头,但后续的标头在第一个添加的标头中连接。

默认行为使得给定请求的接收者对一组cookie的访问变得复杂,因为在单独的cookie的字符串中再次将标题分开是不容易的。

有没有办法将 n 添加一些标题?

也许某些标题不能重复,但Set-Cookie是一个有效的用例,因为接收者应该读取的不仅仅是cookie。

谢谢。

1 个答案:

答案 0 :(得分:1)

在花了一些时间寻找开箱即用的解决方案后,我结束了对System.Net.WebHeaderCollection实施扩展方法:

public static class WebHeaderCollectionExtensions
{
    public static ILookup<string, string> ToLookup(this WebHeaderCollection some)
    {
        List<KeyValuePair<string, string>> headers = new List<KeyValuePair<string, string>>();

        if (some.Count > 0)
        {
            string[] tempSplittedHeaders = null;

            foreach (string headerName in some)
            {
                if (some[headerName].Contains(";,"))
                {
                    tempSplittedHeaders = Regex.Split(some[headerName], ";,");

                    foreach (string splittedHeader in tempSplittedHeaders)
                    {
                        headers.Add(new KeyValuePair<string, string>(headerName, splittedHeader));
                    }
                }
                else
                {
                    headers.Add(new KeyValuePair<string, string>(headerName, some[headerName]));
                }
            }
        }

        return headers.ToLookup(keySelector => keySelector.Key, elementSelector => elementSelector.Value);
    }
}

由于这个很好的扩展方法,我能够将头部的集合转换为查找,这允许重复的密钥,并在一天结束时,进行一些处理,我得到一个单独的所有HTTP头的列表:

string wholeCookie = WebOperationContext.Current.IncomingRequest.Headers.ToLookup()["Set-Cookie"].Single(cookie => cookie.Contains("[Cookie name]"));

我希望分享我的解决方案将是一个很好的贡献,因为我猜其他人已经或正在使用类似的案例!