2016-05-05 205 views
2

我收到的错误:大小限制解决方法FormUrlEncodedContent

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

看看[此帖](http://stackoverflow.com/questions/6695208/uri-escapedatastring-invalid- uri-the-uri-string-is-too-long/10755250#10755250) –

+0

我对提供的链接中的示例有点困惑。那个例子是使用一个字符串,我有一本字典? – PixelPaul

回答

1

让我们现有的代码适应解决方案this post

int limit = 2000; 

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

    StringBuilder sbInternal = new StringBuilder(); 
    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()); 

快速的演练,代码:内爆在你的字典使用的限制防爆URL编码方法LINQ的聚合每个键 - 值对(放慢参数)。

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

无法测试,希望对大家有所帮助。

0

如果您的请求是较大的使用的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(); 
    } 
}