37

そこで、 を作成し、HttpClientを使用してデータを投稿してHttpClient.PostAsync()います。

私はHttpContent使用を設定しました

HttpContent content = new FormUrlEncodedContent(post_parameters); post_parametersキーと値のペアのリストList<KeyValuePair<string, string>>

問題は、 のHttpContent値が大きい場合 (画像を base64 に変換して送信する場合)、URL is too long エラーが発生することです。これは理にかなっています。URL が 32,000 文字を超えることはできないためです。しかし、HttpContentこの方法ではない場合、どうすればデータを追加できますか?

助けてください。

4

3 に答える 3

31

FormUrlEncodedContent内部的に使用しますUri.EscapeDataString: リフレクションから、このメソッドにはリクエストの長さのサイズを制限する定数があることがわかります。

考えられる解決策は、 (.net 4.5) をFormUrlEncodedContent使用して の新しい実装を作成し、この制限を回避することです。System.Net.WebUtility.UrlEncode

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を使用することをお勧めします。

于 2014-05-19T14:27:21.827 に答える