Какой лучший способ проверить наличие дубликатов ключей в запросах Querystring / Post / Get - PullRequest
10 голосов
/ 23 сентября 2011

Я пишу небольшой API и мне нужно проверять дубликаты ключей в запросах.Может ли кто-нибудь порекомендовать лучший способ проверить наличие дубликатов ключей.Я знаю, что могу проверить ключ. Значение для запятых в строке, но затем у меня есть еще одна проблема - не разрешать запятые в запросах 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]);
        }       
    }

1 Ответ

20 голосов
/ 23 сентября 2011

QueryString представляет собой NameValueCollection, что объясняет, почему дублированные значения ключей отображаются в виде списка через запятую (из документации для метода Add ):

Если указаноключ уже существует в целевом экземпляре NameValueCollection, указанное значение добавляется в существующий список значений через запятую в виде «значение1, значение2, значение3».

Так, например, с учетом этогоСтрока запроса: 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
...