Подтвердить что ты не робот

Как установить большую строку внутри HttpContent при использовании HttpClient?

Итак, я создал HttpClient и опубликовал данные с помощью HttpClient.PostAsync().

Я установил HttpContent, используя

HttpContent content = new FormUrlEncodedContent(post_parameters); где post_parameters - это список пар значений ключа List<KeyValuePair<string, string>>

Проблема в том, что когда HttpContent имеет большое значение (изображение преобразуется в base64 для передачи), я получаю URL слишком длинную ошибку. Это имеет смысл - причина не может превышать 32 000 символов. Но как добавить данные в HttpContent, если не так?

Пожалуйста, помогите.

4b9b3361

Ответ 1

Я понял это с помощью моего друга. То, что вы хотели бы сделать, это не использовать FormUrlEncodedContent(), потому что у него есть ограничения на размер uri. Вместо этого вы можете сделать следующее:

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

Здесь нам не нужно использовать HttpContent для отправки на сервер, StringContent выполняет задание!

Ответ 2

FormUrlEncodedContent внутренне использует Uri.EscapeDataString: от отражения, я вижу, что этот метод имеет константы, ограничивающие размер длины запроса.

Возможным решением является создание новой реализации FormUrlEncodedContent с помощью System.Net.WebUtility.UrlEncode (.net 4.5), чтобы обойти это ограничение.

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", "+");
    }
}

Чтобы отправить большой контент, лучше использовать StreamContent.

Ответ 3

Этот код работает для меня, в основном вы отправляете почтовые данные "application/x-www-form-urlencoded" в строковое содержимое через http client, надеемся, что это может помочь любому, у кого есть такая же проблема, как и я.

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