Obtenga los parámetros de consulta individuales de Uri

Tengo una cadena uri como: http://example.com/file?a=1&b=2&c=string%20param

¿Existe una función existente que convertiría cadena de parámetros de consulta en un diccionario de la misma manera que lo hace ASP.NET Context.Request?

Estoy escribiendo una aplicación de consola y no un servicio web, por lo que no hay Contexto. Solicitud para analizar la URL por mí.

Sé que es bastante fácil descifrar la cadena de consulta, pero prefiero usar una función FCL si existe.

Utilizar esta:

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

Este código de Tejs no es la forma “correcta” de obtener la cadena de consulta del URI:

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

Puedes usar:

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

MSDN

Esto debería funcionar:

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

De acuerdo con MSDN . No es exactamente el tipo de colección que está buscando, pero sí útil.

Editar: Aparentemente, si proporciona la URL completa a ParseQueryString , agregará ‘ http://example.com/archivo?a ‘ como la primera clave de la colección. Como probablemente eso no sea lo que quieres, agregué la subcadena para obtener solo la parte relevante de la url.

Tenía que hacer esto para una aplicación de Windows moderna. Usé lo siguiente:

 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 patwigters = new Dictionary(); while (match.Success) { patwigters.Add(match.Groups[1].Value, match.Groups[2].Value); match = match.NextMatch(); } return patwigters; } } 

Eche un vistazo a HttpUtility.ParseQueryString () Le dará una NameValueCollection lugar de un diccionario, pero aún debe hacer lo que necesita.

La otra opción es usar 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" 

Para proyectos aislados, donde las dependencias deben mantenerse al mínimo, me encontré usando esta implementación:

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

Sin embargo, debo tener en cuenta que no manejo cadenas codificadas de ningún tipo, ya que estaba usando esto en un entorno controlado, donde los problemas de encoding serían un error de encoding en el servidor que deberían corregirse.

En una sola línea de código:

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

A continuación se muestra el enlace para su referencia para utilizar la clase HttpUtility para analizar los valores de la cadena de consulta: http://dnohr.dk/aspnet/how-to-get-url-querystring-variables-from-a-string-url-with-csharp

Puede hacer referencia a System.Web en su aplicación de consola y luego buscar las funciones de utilidad que dividen los parámetros de URL.