2011-09-23 6 views
10

Sto scrivendo una piccola API e ho bisogno di verificare la presenza di chiavi duplicate nelle richieste. Qualcuno potrebbe consigliare il modo migliore per verificare la presenza di chiavi duplicate. Sono consapevole che potrei controllare la chiave.Valore per le virgole nella stringa, ma poi ho un altro problema di non consentire le virgole nelle richieste API.Qual è il modo migliore per verificare la presenza di chiavi duplicate in Querystring/Posta/Richiedi richieste

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

risposta

19

QueryString è un NameValueCollection, il che spiega il motivo per cui i valori chiave duplicati vengono visualizzati come un elenco separato da virgole (dalla documentazione per il metodo Add):

Se la chiave specificata esiste già nel NameValueCollection bersaglio istanza, il valore specificato viene aggiunto all'elenco di valori separati da virgole nella forma "valore1, valore2, valore3".

Così, per esempio, data questa stringa di query: q1=v1&q2=v2,v2&q3=v3&q1=v4, scorrendo le chiavi e il controllo dei valori mostrerà:

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

Dal momento che si desidera consentire per le virgole nei valori stringa di query, si può utilizzare il metodo GetValues, che restituirà un array di stringhe contenente i valori per la chiave nella stringa di query.

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

emette il seguente alla console:

q1 
Key q1 appears 2 times. 
q2 
q3 
+1

io non lo sapevo. +1 e cancellata la mia risposta imprecisa – fearofawhackplanet

+0

Wow! Grazie mille. Prenderesti in considerazione la possibilità di riscrivere il sito Web MSDN? –

+2

Risposta stupenda @ jeff-ogata, c'è un modo per cambiare questo comportamento, quindi invece di questo 'user_ids [] = 1,2,3? Mi piacerebbe avere questo:' user_ids [] = 1 & user_ids [] = 2 e user_ids [] = 3'? – dombesz