private string[] GetHeaderValues(WebHeaderCollection headers, string name) { // .NET 的 webResponse.Headers.GetValues("Set-Cookie") 这个方法有BUG // 例如,服务端写一个COOKIE,响应头应该是: // Set-Cookie: keeplastname=; expires=Tue, 12-Jul-2016 01:54:42 GMT; path=/ // 调用 webResponse.Headers.GetValues("Set-Cookie") 会返回二行的结果: // keeplastname=; expires=Tue // 12-Jul-2016 01:54:42 GMT; path=/ // 然而,内部的集合存储的原始值是正确的, // 所以,只能重新实现这个方法。 var innerList = headers.GetType().InvokeMember("InnerCollection", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetProperty, null, headers, null) as NameObjectCollectionBase; var table = typeof(NameObjectCollectionBase).InvokeMember("_entriesTable", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetField, null, innerList, null) as Hashtable; if (table == null) { return(null); } var entry = table[name]; if (entry == null) { return(null); } var value = entry.GetType().InvokeMember("Value", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetField, null, entry, null) as ArrayList; if (value == null) { return(null); } string[] array = new string[value.Count]; value.CopyTo(array); return(array); }