Así, he creado un HttpClient y estoy publicando datos utilizando HttpClient.PostAsync().

Me puse el HttpContent utilizando

HttpContent content = new FormUrlEncodedContent(post_parameters); donde post_parameters es una lista de pares de valores List<KeyValuePair<string, string>>

Problema es que, cuando el HttpContent tiene un valor grande (una imagen convertida en base64 para ser transmitida) puedo obtener una URL es demasiado larga error. Que tiene sentido – a causa de la url puedes ir más allá de 32.000 caracteres. Pero, ¿cómo hago para agregar los datos en el HttpContent si no de esta manera?

Ayuda por favor.

  • Post StreamContent
  • Estoy confundido…cuando se utiliza cualquier tipo de HttpContent(incluyendo FormUrlEncodedContent) los datos que hay en el cuerpo y no en la Url..así que ¿por qué están viendo los datos en la Url?
  • Cuando puedo hacer la siguiente llamada, dict.Add(new KeyValuePair<string, string>(«Base64FileData», imagen)); (Donde la imagen es la base de 64 convertido cadena). Se produce una excepción.
InformationsquelleAutor Muraad | 2014-05-16

3 Comentarios

  1. 55

    He descubierto con la ayuda de mi amigo. Lo que deseamos hacer es evitar el uso de FormUrlEncodedContent(), ya que tiene restricciones en el tamaño de la uri. En su lugar, usted puede hacer lo siguiente :

        var jsonString = JsonConvert.SerializeObject(post_parameters);
        var content = new StringContent(jsonString, Encoding.UTF8, "application/json");

    Aquí, no necesitamos usar HttpContent de publicar en el servidor, StringContent hace el trabajo !

    • > Aquí, no necesitamos usar HttpContent de publicar en el servidor, StringContent hace el trabajo ! StringContent en realidad es HttpContent (se deriva de lo abstracto HttpContent de manera similar a FormUrlEncodedContent)
    • Este es por lejos la forma más fácil. Otra cosa que he visto por aquí a principios de 2016, es un pan de PITA.
    • Trabajó para mí, Gracias por la ayuda.
  2. 28

    FormUrlEncodedContent utiliza internamente Uri.EscapeDataString : a partir de la reflexión, puedo ver que este método ha constantes de limitar el tamaño de la longitud de la solicitud.

    Una posible solución es crear una nueva aplicación de FormUrlEncodedContent mediante System.Net.WebUtility.UrlEncode (.net 4.5) para eludir esta limitación.

    public class MyFormUrlEncodedContent : ByteArrayContent
    {
        public MyFormUrlEncodedContent(IEnumerable<KeyValuePair<string, string>> nameValueCollection)
            : base(MyFormUrlEncodedContent.GetContentByteArray(nameValueCollection))
        {
            base.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
        }
        private static byte[] GetContentByteArray(IEnumerable<KeyValuePair<string, string>> nameValueCollection)
        {
            if (nameValueCollection == null)
            {
                throw new ArgumentNullException("nameValueCollection");
            }
            StringBuilder stringBuilder = new StringBuilder();
            foreach (KeyValuePair<string, string> current in nameValueCollection)
            {
                if (stringBuilder.Length > 0)
                {
                    stringBuilder.Append('&');
                }
    
                stringBuilder.Append(MyFormUrlEncodedContent.Encode(current.Key));
                stringBuilder.Append('=');
                stringBuilder.Append(MyFormUrlEncodedContent.Encode(current.Value));
            }
            return Encoding.Default.GetBytes(stringBuilder.ToString());
        }
        private static string Encode(string data)
        {
            if (string.IsNullOrEmpty(data))
            {
                return string.Empty;
            }
            return System.Net.WebUtility.UrlEncode(data).Replace("%20", "+");
        }
    }

    Para enviar gran contenido, es mejor usar StreamContent.

    • No puedo utilizar esta solución, ya que estoy utilizando .Net 4.0 y no tengo acceso a el método UrlEncode(). No puedo actualizar debido a las restricciones en el trabajo, cualquier otro pensamiento?
    • mediante la adición de un Sistema.Web de la dependencia, se puede encontrar un método similar HttpUtility.UrlEncode
    • la aplicación que usted me dio, tiene las mismas restricciones que FormUrlEcondedContent() , pero ahora en lugar de lanzar una excepción se salta la convocatoria para publicar en el servidor.
    • Esta solución ha funcionado para mí. Tengo alguna restricción en la api que estoy consumiendo y me tenía que consumir de que el uso de «application/x-www-form-urlencoded». Gracias.
    • Acaba de salir de interés, qué está sucediendo aquí? .Reemplazar(«%20», «+»)
    • Nunca dije esto a nadie en el desbordamiento de pila. Eres un total de badass!
    • Se enfrenta a este problema de hacer a un fuera de control viewstate en un sitio que no me de control, pero necesita la interfaz con… esta clase personalizada guardada mi culo. 😛 gracias

  3. 3

    Este código funciona para mí, básicamente, enviar datos post «application/x-www-form-urlencoded» dentro de la secuencia de contenidos a través de http de cliente, espero que esto pueda ayudar a alguien con el mismo problema como me

    void sendDocument()
        {
            string url = "www.mysite.com/page.php";
            StringBuilder postData = new StringBuilder();
            postData.Append(String.Format("{0}={1}&", HttpUtility.HtmlEncode("prop"), HttpUtility.HtmlEncode("value")));
            postData.Append(String.Format("{0}={1}", HttpUtility.HtmlEncode("prop2"), HttpUtility.HtmlEncode("value2")));
            StringContent myStringContent = new StringContent(postData.ToString(), Encoding.UTF8, "application/x-www-form-urlencoded");
            HttpClient client = new HttpClient();
            HttpResponseMessage message = client.PostAsync(url, myStringContent).GetAwaiter().GetResult();
            string responseContent = message.Content.ReadAsStringAsync().GetAwaiter().GetResult();
        }
    • Pero la OPs problema fue la publicación de grandes cantidades de datos, que no se ha demostrado que puede hacerse de esta manera. Sin embargo, yo veo lo que están haciendo – el uso de application/x-www-form-urlencoded pero omitiendo el uso de class FormUrlEncodedContent que parece tener el contenido de restricción de longitud.
    • Básicamente, esto funcionó para mí. Lo que cambió fue el uso de la WebUtility.UrlEncode("prop2") en lugar de HtmlEncode. Yo tenía un extraño API de punto final que requiere un JSON array dentro de un formulario cuerpo del post. A veces, la matriz podría ser masiva, que es la razón por la que necesitaba algo como esto. Cosas buenas!

Dejar respuesta

Please enter your comment!
Please enter your name here