我收到错误:
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;
}
任何人都可以帮忙吗?
答案 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();
}
}