gpt4 book ai didi

c# - HttpUtility.ParseQueryString 的可移植类库 (PCL) 版本

转载 作者:IT王子 更新时间:2023-10-29 04:54:16 26 4
gpt4 key购买 nike

System.Web 或我可以使用的代码中是否包含 HttpUtility.ParseQueryString 的可移植类库 (PCL) 版本?我想读取一个非常复杂的 URL。

最佳答案

HttpUtility.ParseQueryString返回 HttpValueCollection (内部类)继承自 NameValueCollection . NameValueCollection是像字典一样的键值对的集合,但它支持重复,保持顺序并且只实现 IEnumerable (这个集合是前泛型)。 NameValueCollection PCL 不支持。

我的解决方案(部分从 .NET 框架中提取和修改)是将 HttpValueCollection 替换为 Collection<HttpValue>其中 HttpValue只是一个键值对。

public sealed class HttpUtility
{
public static HttpValueCollection ParseQueryString(string query)
{
if (query == null)
{
throw new ArgumentNullException("query");
}

if ((query.Length > 0) && (query[0] == '?'))
{
query = query.Substring(1);
}

return new HttpValueCollection(query, true);
}
}

public sealed class HttpValue
{
public HttpValue()
{
}

public HttpValue(string key, string value)
{
this.Key = key;
this.Value = value;
}

public string Key { get; set; }
public string Value { get; set; }
}

public class HttpValueCollection : Collection<HttpValue>
{
#region Constructors

public HttpValueCollection()
{
}

public HttpValueCollection(string query)
: this(query, true)
{
}

public HttpValueCollection(string query, bool urlencoded)
{
if (!string.IsNullOrEmpty(query))
{
this.FillFromString(query, urlencoded);
}
}

#endregion

#region Parameters

public string this[string key]
{
get { return this.First(x => string.Equals(x.Key, key, StringComparison.OrdinalIgnoreCase)).Value; }
set { this.First(x => string.Equals(x.Key, key, StringComparison.OrdinalIgnoreCase)).Value = value; }
}

#endregion

#region Public Methods

public void Add(string key, string value)
{
this.Add(new HttpValue(key, value));
}

public bool ContainsKey(string key)
{
return this.Any(x => string.Equals(x.Key, key, StringComparison.OrdinalIgnoreCase));
}

public string[] GetValues(string key)
{
return this.Where(x => string.Equals(x.Key, key, StringComparison.OrdinalIgnoreCase)).Select(x => x.Value).ToArray();
}

public void Remove(string key)
{
this.Where(x => string.Equals(x.Key, key, StringComparison.OrdinalIgnoreCase))
.ToList()
.ForEach(x => this.Remove(x));
}

public override string ToString()
{
return this.ToString(true);
}

public virtual string ToString(bool urlencoded)
{
return this.ToString(urlencoded, null);
}

public virtual string ToString(bool urlencoded, IDictionary excludeKeys)
{
if (this.Count == 0)
{
return string.Empty;
}

StringBuilder stringBuilder = new StringBuilder();

foreach (HttpValue item in this)
{
string key = item.Key;

if ((excludeKeys == null) || !excludeKeys.Contains(key))
{
string value = item.Value;

if (urlencoded)
{
// If .NET 4.5 and above (Thanks @Paya)
key = WebUtility.UrlDecode(key);
// If .NET 4.0 use this instead.
// key = Uri.EscapeDataString(key);
}

if (stringBuilder.Length > 0)
{
stringBuilder.Append('&');
}

stringBuilder.Append((key != null) ? (key + "=") : string.Empty);

if ((value != null) && (value.Length > 0))
{
if (urlencoded)
{
value = Uri.EscapeDataString(value);
}

stringBuilder.Append(value);
}
}
}

return stringBuilder.ToString();
}

#endregion

#region Private Methods

private void FillFromString(string query, bool urlencoded)
{
int num = (query != null) ? query.Length : 0;
for (int i = 0; i < num; i++)
{
int startIndex = i;
int num4 = -1;
while (i < num)
{
char ch = query[i];
if (ch == '=')
{
if (num4 < 0)
{
num4 = i;
}
}
else if (ch == '&')
{
break;
}
i++;
}
string str = null;
string str2 = null;
if (num4 >= 0)
{
str = query.Substring(startIndex, num4 - startIndex);
str2 = query.Substring(num4 + 1, (i - num4) - 1);
}
else
{
str2 = query.Substring(startIndex, i - startIndex);
}

if (urlencoded)
{
this.Add(Uri.UnescapeDataString(str), Uri.UnescapeDataString(str2));
}
else
{
this.Add(str, str2);
}

if ((i == (num - 1)) && (query[i] == '&'))
{
this.Add(null, string.Empty);
}
}
}

#endregion
}

更新

更新后,HttpValueCollection 现在继承自 Collection,而不是评论中突出显示的 List。

更新 2

如果使用 .NET 4.5,更新为使用 WebUtility.UrlDecode,感谢@Paya。

关于c# - HttpUtility.ParseQueryString 的可移植类库 (PCL) 版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20268544/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com