Estate atento ya que en este escrito encontrarás la respuesta que buscas.Este artículo fue probado por nuestros expertos para garantizar la calidad y veracidad de nuestro contenido.
Solución:
Puede crear una nueva instancia escribible de HttpValueCollection
llamando System.Web.HttpUtility.ParseQueryString(string.Empty)
y luego utilícelo como cualquier NameValueCollection
. Una vez que haya agregado los valores que desea, puede llamar ToString
en la colección para obtener una consulta stringcomo sigue:
NameValueCollection queryString = System.Web.HttpUtility.ParseQueryString(string.Empty);
queryString.Add("key1", "value1");
queryString.Add("key2", "value2");
return queryString.ToString(); // Returns "key1=value1&key2=value2", all URL-encoded
los HttpValueCollection
es interno y, por lo tanto, no puede construir directamente una instancia. Sin embargo, una vez que obtenga una instancia, puede usarla como cualquier otra NameValueCollection
. Dado que el objeto real con el que está trabajando es un HttpValueCollection
llamar al método ToString llamará al método anulado en HttpValueCollection
que da formato a la colección como una consulta codificada en URL string.
Después de buscar en SO y en la web una respuesta a un problema similar, esta es la solución más simple que pude encontrar.
Núcleo de .NET
Si está trabajando en .NET Core, puede usar el Microsoft.AspNetCore.WebUtilities.QueryHelpers
class, lo que simplifica esto enormemente.
https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.webutilities.queryhelpers
Código de muestra:
const string url = "https://customer-information.azure-api.net/customers/search/taxnbr";
var param = new Dictionary() "CIKey", "123456789" ;
var newUrl = new Uri(QueryHelpers.AddQueryString(url, param));
Si mira debajo del capó, la propiedad QueryString es una NameValueCollection. Cuando hice cosas similares, generalmente me interesó serializar Y deserializar, por lo que mi sugerencia es crear una NameValueCollection y luego pasar a:
using System.Linq;
using System.Web;
using System.Collections.Specialized;
private string ToQueryString(NameValueCollection nvc)
var array = (
from key in nvc.AllKeys
from value in nvc.GetValues(key)
select string.Format(
"0=1",
HttpUtility.UrlEncode(key),
HttpUtility.UrlEncode(value))
).ToArray();
return "?" + string.Join("&", array);
Me imagino que también hay una manera súper elegante de hacer esto en LINQ…
Con la inspiración del comentario de Roy Tinker, terminé usando un método de extensión simple en la clase Uri que mantiene mi código conciso y limpio:
using System.Web;
public static class HttpExtensions
public static Uri AddQuery(this Uri uri, string name, string value)
var httpValueCollection = HttpUtility.ParseQueryString(uri.Query);
httpValueCollection.Remove(name);
httpValueCollection.Add(name, value);
var ub = new UriBuilder(uri);
ub.Query = httpValueCollection.ToString();
return ub.Uri;
Uso:
Uri url = new Uri("http://localhost/rest/something/browse").
AddQuery("page", "0").
AddQuery("pageSize", "200");
Editar: variante compatible con los estándares
Como varias personas señalaron, httpValueCollection.ToString()
codifica caracteres Unicode de una manera que no cumple con los estándares. Esta es una variante del mismo método de extensión que maneja dichos caracteres invocando HttpUtility.UrlEncode
método en lugar del obsoleto HttpUtility.UrlEncodeUnicode
método.
using System.Web;
public static Uri AddQuery(this Uri uri, string name, string value)
var httpValueCollection = HttpUtility.ParseQueryString(uri.Query);
httpValueCollection.Remove(name);
httpValueCollection.Add(name, value);
var ub = new UriBuilder(uri);
// this code block is taken from httpValueCollection.ToString() method
// and modified so it encodes strings with HttpUtility.UrlEncode
if (httpValueCollection.Count == 0)
ub.Query = String.Empty;
else
var sb = new StringBuilder();
for (int i = 0; i < httpValueCollection.Count; i++)
string text = httpValueCollection.GetKey(i);
vals.Length == 0)
sb.Append(val);
else
if (vals.Length == 1)
sb.Append(val);
sb.Append(HttpUtility.UrlEncode(vals[0]));
else
for (int j = 0; j < vals.Length; j++)
if (j > 0)
sb.Append('&');
sb.Append(val);
sb.Append(HttpUtility.UrlEncode(vals[j]));
ub.Query = sb.ToString();
return ub.Uri;
Aquí tienes las reseñas y valoraciones
Recuerda algo, que tienes permiso de agregar una reseña si te ayudó.