UnityWebRequest.Postに32KB以上のデータを与えると、UriFormatException: Uri is longer than the maximum {0} characters.が発生します。これは、UnityWebRequestのPostの内部でUri.EscapeDataStringを使用しており、本来は制約がないはずのPostのデータについても、Uriの32768文字制約が適用されるためです。具体的に、UnityのソースコードをデコンパイルしたSerializeSimpleFormにおいて、Uri.EscapeDataString(current.Value)を呼んでいることがわかります。

この問題を回避するには、Uri.EscapeDataStringを細かく呼ぶ以下のようなクラスを自作して、UnityWebRequest.Postを置き換える必要があります。

尚、検証に使用したUnityは5.5.4f1です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Text;
using UnityEngine.Scripting;
using UnityEngineInternal;

public class UnityWebRequestUnlimited : MonoBehaviour {
	private static string EscapeLongDataString(string stringToEscape)
	{
		var sb = new StringBuilder();
		var length = stringToEscape.Length;

		// 32767以上だとエラーになるため分割する
		var limit = 32767 - 1;
		for (int i = 0; i < length; i += limit)
		{
			sb.Append(Uri.EscapeDataString(stringToEscape.Substring(i, Math.Min(limit, length - i))));
		}

		return sb.ToString();
	}

	public static byte[] SerializeSimpleForm(Dictionary formFields)
	{
		string text = "";
		foreach (KeyValuePair current in formFields)
		{
			if (text.Length > 0)
			{
				text += "&";
			}
			text = text + Uri.EscapeDataString(current.Key) + "=" + EscapeLongDataString(current.Value);
		}
		return Encoding.UTF8.GetBytes(text);
	}

	public static UnityWebRequest Post(string uri, Dictionary formFields)
	{
		UnityWebRequest unityWebRequest = new UnityWebRequest(uri, "POST");
		byte[] data = null;
		if (formFields != null && formFields.Count != 0)
		{
			data = UnityWebRequestUnlimited.SerializeSimpleForm(formFields);
		}
		unityWebRequest.uploadHandler = new UploadHandlerRaw(data)
		{
			contentType = "application/x-www-form-urlencoded"
		};
		unityWebRequest.downloadHandler = new DownloadHandlerBuffer();
		return unityWebRequest;
	}
}