我需要使用Set-Cookie
类发送超过HttpWebRequest
HTTP标头。
问题首先request.Headers.Add("Set-Cookie", "[cookie string]")
按预期添加标头,但后续的标头在第一个添加的标头中连接。
默认行为使得给定请求的接收者对一组cookie的访问变得复杂,因为在单独的cookie的字符串中再次将标题分开是不容易的。
有没有办法将 n 添加一些标题?
也许某些标题不能重复,但Set-Cookie
是一个有效的用例,因为接收者应该读取的不仅仅是cookie。
谢谢。
答案 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]"));
我希望分享我的解决方案将是一个很好的贡献,因为我猜其他人已经或正在使用类似的案例!