C # HttpWebRequest de tipo “application / x-www-form-urlencoded” – ¿cómo enviar el carácter ‘&’ en el cuerpo del contenido?

Estoy escribiendo una pequeña aplicación conectada a API en C #.

Me conecto a una API que tiene un método que toma una cadena larga, el contenido de un archivo de calendario (ics).

Lo estoy haciendo así:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL); request.Method = "POST"; request.AllowAutoRedirect = false; request.CookieContainer = my_cookie_container; request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; request.ContentType = "application/x-www-form-urlencoded"; string iCalStr = GetCalendarAsString(); string strNew = "&uploadfile=true&file=" + iCalStr; using (StreamWriter stOut = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII)) { stOut.Write(strNew); stOut.Close(); } 

Esto parece funcionar muy bien, hasta que agregue un poco de HTML específico en mi calendario.

Si tengo un ‘& nbsp’ en algún lugar de mi calendario (o similar), el servidor solo obtiene todos los datos hasta el punto ‘&’, así que supongo que ‘&’ hace que parezca cualquier cosa después de que este punto pertenezca a un nuevo parámetro?

¿Cómo puedo arreglar esto?

Como su tipo de contenido es application/x-www-form-urlencoded , necesitará codificar el cuerpo POST, especialmente si contiene caracteres como & que tienen un significado especial en un formulario.

Intente pasar su cadena a través de HttpUtility.UrlEncode antes de escribirla en la secuencia de solicitud.

Aquí hay un par de enlaces para referencia.

Primero instale el paquete nuget ” Microsoft ASP.NET Web API Client “:

  PM > Install-Package Microsoft.AspNet.WebApi.Client 

Luego use la siguiente función para publicar sus datos:

 public static async Task PostFormUrlEncoded(string url, IEnumerable> postData) { using (var httpClient = new HttpClient()) { using (var content = new FormUrlEncodedContent(postData)) { content.Headers.Clear(); content.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); HttpResponseMessage response = await httpClient.PostAsync(url, content); return await response.Content.ReadAsAsync(); } } } 

Y esta es la forma de usarlo:

 TokenResponse tokenResponse = await PostFormUrlEncoded(OAuth2Url, OAuth2PostData); 

o

 TokenResponse tokenResponse = (Task.Run(async () => await PostFormUrlEncoded(OAuth2Url, OAuth2PostData))) .Result 

o (no recomendado)

 TokenResponse tokenResponse = PostFormUrlEncoded(OAuth2Url, OAuth2PostData).Result; 

Siempre que el servidor permita que se publique el carácter ampresand (no todos lo hacen, ya que puede ser inseguro), todo lo que debe hacer es URL Codificar el carácter. En el caso de una empresa, debe reemplazar el carácter con %26 .

.NET proporciona una buena forma de codificar toda la cadena por ti:

 string strNew = "&uploadfile=true&file=" + HttpUtility.UrlEncode(iCalStr);