5

私はこのようなPOSTを行おうとしています:

    HttpClient hc = new HttpClient();
    byte[] bytes = ReadFile(@"my_path");

    var postData = new List<KeyValuePair<string, string>>();
    postData.Add(new KeyValuePair<string, string>("FileName", "001.jpeg"));
    postData.Add(new KeyValuePair<string, string>("ConvertToExtension", ".pdf"));
    postData.Add(new KeyValuePair<string, string>("Content", Convert.ToBase64String(bytes)));

    HttpContent content = new FormUrlEncodedContent(postData);
    hc.PostAsync("url", content).ContinueWith((postTask) => {
    postTask.Result.EnsureSuccessStatusCode();
    });

しかし、私はこの例外を受け取ります:

無効なURI:Uri文字列が長すぎます。

この行について不平を言う:HttpContent content = new FormUrlEncodedContent(postData);。小さいファイルの場合は機能しますが、大きいファイルの場合は機能しない理由がわかりません。

POSTを実行すると、コンテンツが大きくなる可能性があります...それでは、なぜURIについて文句を言うのですか?

4

2 に答える 2

5

データを「application/x」として送信するFormUrlEncodedContentの代わりに、MultipartFormDataContent(http://msdn.microsoft.com/en-us/library/system.net.http.multipartformdatacontent%28v=vs.110%29 )を使用する必要があります。 -www-form-urlencoded」。

したがって、POST動詞を使用している場合でも、データを含む非常に長いURLにPOSTしているため、エラーが発生します。

コンテンツタイプ「application/x-www-form-urlencoded」は、非ASCII文字を含む大量のバイナリデータまたはテキストを送信するには非効率的です。コンテンツタイプ「multipart/form-data」は、ファイル、非ASCIIデータ、およびバイナリデータを含むフォームを送信するために使用する必要があります。

参照:http ://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1

サンプルについては、次の回答をご覧ください:ASP.NET WebApi:WebApiHttpClientを使用してファイルアップロードでマルチパート投稿を実行する方法

于 2012-08-15T08:48:42.847 に答える
0

私はこれがすでに答えられていることを知っていますが、私はこれと同じ問題に遭遇し、それがFormUrlEncodedContentクラスの制限であることがわかりました。エラーの理由は、オブジェクトのエンコーディングがによって処理されているためUri.EscapeDataString()です。この投稿では、CodePlexで説明しています。代わりにHTTPUtilityクラスを使用して、UrlEncodeに対する独自のソリューションを思いつくことになりました。

using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Web;

namespace Wfm.Net.Http
{
    public class UrlContent : ByteArrayContent
    {
        public UrlContent(IEnumerable<KeyValuePair<string, string>> content)
            : base(GetCollectionBytes(content, Encoding.UTF8))
        {
        }

        public UrlContent(byte[] content, int offset, int count) : base(content, offset, count)
        {
        }

        private static byte[] GetCollectionBytes(IEnumerable<KeyValuePair<string, string>> c, Encoding encoding)
        {
            string str = string.Join("&", c.Select(i => string.Concat(HttpUtility.UrlEncode(i.Key), '=', HttpUtility.UrlEncode(i.Value))).ToArray());
            return encoding.GetBytes(str);
        }
    }


}

私はそれをどのように実装したかについての小さな記事を書きました。これが同じ問題を抱えている人に役立つことを願っています。

于 2014-08-22T13:07:35.470 に答える