FormUrlEncodedContent的大小限制解决方法

时间:2016-05-05 18:08:57

标签: c# .net

我收到错误:

System.UriFormatException: Invalid URI: The Uri string is too long.

问题在于这一行:

FormUrlEncodedContent content = new FormUrlEncodedContent(postData); 

经过研究,我得知这是因为 FormUrlEncodedContent 类的大小限制。但我不确定如何解决这个问题?请参阅以下代码:

 public Token RequestToken(string username, int businessID, string requestXml)
    {
        var postData = new Dictionary<string, string>() { { "username", username }, { "businessID", businessID.ToString() }, { "authenticator", requestXml } };
        FormUrlEncodedContent content = new FormUrlEncodedContent(postData);          

        try
        {
            HttpResponseMessage response = _client.PostAsync("Token", content).Result;
            if (response.IsSuccessStatusCode)
            {
                return response.Content.ReadAsAsync<Token>().Result;
            }
        }
        catch (Exception ex)
        {
            log.Error(ex);
        }

        return null;
    }

任何人都可以帮忙吗?

2 个答案:

答案 0 :(得分:2)

让我们将您现有的代码调整为this post

中的解决方案
int limit = 2000;

StringContent content = new StringContent(postData.Aggregate(new StringBuilder(), (sb, nxt) => {

    StringBuilder sbInternal = new StringBuilder();

    if (sb.Length > 0)
    {
        sb.Append("&");
    }

    int loops = nxt.Value.Length / limit;

    for (int i = 0; i <= loops; i++)
    {
        if (i < loops)
        {
            sbInternal.Append(Uri.EscapeDataString(nxt.Value.Substring(limit * i, limit)));
        }
        else
        {
            sbInternal.Append(Uri.EscapeDataString(nxt.Value.Substring(limit * i)));
        }
    }

    return sb.Append(nxt.Key + "=" + sbInternal.ToString());
}).ToString(), Encoding.UTF8, "application/x-www-form-urlencoded");

快速演练该代码:使用限制性URL编码方法使用LINQ&#39;聚合内容破坏字典中的每个键值对(参数)。

Uri.EscapteDataString method is limited to 32766 characters的字符串参数的长度,limit本地属性必须为32766,以避免不必要的迭代。

这就是你现在应该如何创建内容,而不是使用FormUrlEncodedContent

希望它会有所帮助。

答案 1 :(得分:2)

如果您的请求更大,请使用multipart / form-data:

using (var content = new MultipartFormDataContent())
{
    foreach (var keyValuePair in data)
    {
        content.Add(new StringContent(keyValuePair.Value), keyValuePair.Key);
    }

    // send POST request
    using (var client = new HttpClient())
    {
        return client.PostAsync(identifier.IsirUrl + uri, content).GetAwaiter().GetResult();
    }
}