2011-09-23 686 views
10

Escribo una pequeña API y necesito verificar las claves duplicadas en las solicitudes. ¿Alguien podría recomendar la mejor manera de verificar si hay llaves duplicadas? Soy consciente de que podría verificar la clave. Valor para las comas en la cadena, pero luego tengo otro problema de no permitir comas en las solicitudes de la API.¿Cuál es la mejor forma de comprobar si hay claves duplicadas en las solicitudes de Querystring/Post/Get?

//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]); 
     }  
    } 

Respuesta

19

cadena de consulta es un NameValueCollection, lo que explica por qué los valores de clave duplicados aparecen como una lista separada por comas (de la documentación para el método Add):

Si la clave especificada ya existe en la NameValueCollection objetivo instancia, el valor especificado se agrega a la lista de valores separados por comas existentes en la forma "valor1, valor2, valor3".

Así, por ejemplo, dada esta cadena de consulta: q1=v1&q2=v2,v2&q3=v3&q1=v4, iteración a través de las teclas y la comprobación de los valores mostrará:

Key: q1 Value:v1,v4 
Key: q2 Value:v2,v2 
Key: q3 Value:v3 

Puesto que usted quiere permitir comas en los valores de cadena de consulta, puede utilice el método GetValues, que devolverá una matriz de cadenas que contiene los valores de la clave en la cadena de consulta.

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(); 
} 

da salida a la siguiente en la consola:

q1 
Key q1 appears 2 times. 
q2 
q3 
+1

yo no lo sabía. +1 y eliminó mi respuesta inexacta – fearofawhackplanet

+0

¡Guau! Muchas gracias. ¿Consideraría reescribir el sitio web de MSDN? –

+2

Awesome answer @ jeff-ogata, ¿hay alguna forma de que pueda cambiar este comportamiento, así que en lugar de esto 'user_ids [] = 1,2,3' me gustaría tener esto:' user_ids [] = 1 & user_ids [] = 2 y user_ids [] = 3'? – dombesz

Cuestiones relacionadas