Ottieni parametri di query individuali da Uri

Ho una stringa uri come: http://example.com/file?a=1&b=2&c=string%20param

Esiste una funzione esistente che converte la stringa del parametro di query in un dizionario allo stesso modo di ASP.NET Context.Request.

Sto scrivendo un’app console e non un servizio Web, quindi non esiste Context.Request per analizzare l’URL per me.

So che è abbastanza facile da crackare la stringa di query da solo, ma preferisco usare una funzione FCL se esiste.

Usa questo:

string uri = ...; string queryString = new System.Uri(uri).Query; var queryDictionary = System.Web.HttpUtility.ParseQueryString(queryString); 

Questo codice di Tejs non è il modo “corretto” per ottenere la stringa di query dall’URI:

 string.Join(string.Empty, uri.Split('?').Skip(1)); 

Puoi usare:

 var queryString = url.Substring(url.IndexOf('?')).Split('#')[0] System.Web.HttpUtility.ParseQueryString(queryString) 

MSDN

Questo dovrebbe funzionare:

 string url = "http://example.com/file?a=1&b=2&c=string%20param"; string querystring = url.Substring(url.IndexOf('?')); System.Collections.Specialized.NameValueCollection parameters = System.Web.HttpUtility.ParseQueryString(querystring); 

Secondo MSDN . Non è esattamente il tipo di raccolta che stai cercando, ma comunque utile.

Modifica: Apparentemente, se si fornisce l’URL completo a ParseQueryString , verrà aggiunto ” http://example.com/file?a ” come prima chiave della raccolta. Poiché probabilmente non è ciò che desideri, ho aggiunto la sottostringa per ottenere solo la parte rilevante dell’URL.

Ho dovuto farlo per una moderna app di Windows. Ho usato il seguente:

 public static class UriExtensions { private static readonly Regex _regex = new Regex(@"[?&](\w[\w.]*)=([^?&]+)"); public static IReadOnlyDictionary ParseQueryString(this Uri uri) { var match = _regex.Match(uri.PathAndQuery); var paramaters = new Dictionary(); while (match.Success) { paramaters.Add(match.Groups[1].Value, match.Groups[2].Value); match = match.NextMatch(); } return paramaters; } } 

Dai un’occhiata a HttpUtility.ParseQueryString () Ti darà un NameValueCollection invece di un dizionario, ma dovrebbe comunque fare ciò di cui hai bisogno.

L’altra opzione è usare string.Split() .

  string url = @"http://example.com/file?a=1&b=2&c=string%20param"; string[] parts = url.Split(new char[] {'?','&'}); ///parts[0] now contains http://example.com/file ///parts[1] = "a=1" ///parts[2] = "b=2" ///parts[3] = "c=string%20param" 

Per i progetti isolati, in cui le dipendenze devono essere ridotte al minimo, mi sono trovato a utilizzare questa implementazione:

 var arguments = uri.Query .Substring(1) // Remove '?' .Split('&') .Select(q => q.Split('=')) .ToDictionary(q => q.FirstOrDefault(), q => q.Skip(1).FirstOrDefault()); 

Tuttavia, si tenga presente che non gestisco stringhe codificate di alcun tipo, poiché stavo usando questo in un ambiente controllato, dove i problemi di codifica sarebbero un errore di codifica sul lato server che dovrebbe essere corretto.

In una singola riga di codice:

 string xyz = Uri.UnescapeDataString(HttpUtility.ParseQueryString(Request.QueryString.ToString()).Get("XYZ")); 

Di seguito è riportato il link per il tuo riferimento per utilizzare la class HttpUtility per analizzare i valori della query querystring: http://dnohr.dk/aspnet/how-to-get-url-querystring-variables-from-a-string-url-with-csharp

Microsoft Azure offre un framework che semplifica l’esecuzione di questo. http://azure.github.io/azure-mobile-services/iOS/v2/Classes/MSTable.html#//api/name/readWithQueryString:completion :

È ansible fare riferimento a System.Web nell’applicazione console e quindi cercare le funzioni Utility che suddividono i parametri URL.