我正在编写一个小API,需要检查请求中的重复键。有人可以推荐检查重复密钥的最佳方法。我知道我可以检查key.Value中字符串中的逗号,但后来我又遇到了另一个不允许在API请求中使用逗号的问题。
//Does not compile- just for illustration
private void convertQueryStringToDictionary(HttpContext context)
{
queryDict = new Dictionary<string, string>();
foreach (string key in context.Request.QueryString.Keys)
{
if (key.Count() > 0) //Error here- How do I check for multiple values?
{
context.Response.Write(string.Format("Uh-oh"));
}
queryDict.Add(key, context.Request.QueryString[key]);
}
}
答案 0 :(得分:20)
QueryString是NameValueCollection
,它解释了重复键值显示为逗号分隔列表的原因(来自Add方法的文档):
如果指定的密钥已存在于目标NameValueCollection中 实例,将指定的值添加到现有的逗号分隔中 “value1,value2,value3”形式的值列表。
因此,例如,给定此查询字符串:q1=v1&q2=v2,v2&q3=v3&q1=v4
,迭代键并检查值将显示:
Key: q1 Value:v1,v4
Key: q2 Value:v2,v2
Key: q3 Value:v3
由于您希望在查询字符串值中允许使用逗号,因此可以使用GetValues方法,该方法将返回一个字符串数组,其中包含查询字符串中键的值。
static void Main(string[] args)
{
HttpRequest request = new HttpRequest("", "http://www.stackoverflow.com", "q1=v1&q2=v2,v2&q3=v3&q1=v4");
var queryString = request.QueryString;
foreach (string k in queryString.Keys)
{
Console.WriteLine(k);
int times = queryString.GetValues(k).Length;
if (times > 1)
{
Console.WriteLine("Key {0} appears {1} times.", k, times);
}
}
Console.ReadLine();
}
将以下内容输出到控制台:
q1
Key q1 appears 2 times.
q2
q3