2014-05-16 4 views
23

그래서 HttpClient을 만들고 HttpClient.PostAsync()을 사용하여 데이터를 게시하고 있습니다. HttpClient를 사용할 때 HttpContent 내부에 큰 문자열을 설정하는 방법은 무엇입니까?

나는

HttpContent content = new FormUrlEncodedContent(post_parameters)

를 사용하여 HttpContent을 설정; post_parametersList<KeyValuePair<string, string>>

문제가 키 값 쌍의 목록입니다 어디 HttpContent가 큰 값을 가질 때, 나는 URL이 너무 긴 오류가 얻을 (이미지가 64 기수로 변환 전송한다). URL 검색은 32,000자를 넘기 때문에 의미가 있습니다. 그러나 이런 식으로하지 않으면 데이터를 HttpContent에 어떻게 추가합니까?

도와주세요.

+1

나처럼 같은 문제를 가진 사람을 도울 수 있기를 바랍니다 Post'StreamContent' –

+0

'HttpContent' (FormUrlEncodedContent를 포함하여)를 사용하면 혼란 스럽습니다. 데이터가 Url이 아닌 본문에 있습니다. 그래서 Url에있는 데이터를 어떻게 보십니까? –

+0

다음 전화를 걸 때 dict.Add (새 KeyValuePair <문자열, 문자열> ("Base64FileData", 이미지)); (여기서 image는 변환 된 기본 64 문자열입니다.) 예외가 Throw됩니다. – Muraad

답변

33

나는 그것을 친구의 도움으로 알아 냈습니다. uri의 크기에 제한이 있기 때문에 FormUrlEncodedContent()를 사용하지 않는 것이 좋습니다. 대신, 다음과 같은 작업을 수행 할 수

var jsonString = JsonConvert.SerializeObject(post_parameters); 
    var content = new StringContent(jsonString, Encoding.UTF8, "application/json"); 

을 여기에, 우리는 서버에 게시 HttpContent를 사용할 필요가 없습니다, StringContent는 일을 얻는다! 이 코드는 나를 위해 작동

+3

> 여기에 HttpContent를 사용하여 서버에 게시 할 필요가 없으며 StringContent가 작업을 완료합니다! 'StringContent'는 실제로'HttpContent'입니다 (이것은'FormUrlEncodedContent'와 유사하게 추상'HttpContent'에서 유래했습니다). – eXavier

+0

이것은 훨씬 쉬운 방법입니다. 여기서 2016 년 초반에 본 다른 것은 피타입니다. – mafu

23

FormUrlEncodedContent은 내부에서 Uri.EscapeDataString을 사용합니다.이 메소드에는 요청 길이의 크기를 제한하는 상수가 있음을 알 수 있습니다.

System.Net.WebUtility.UrlEncode (.net 4.5)을 사용하여이 제한을 우회하여 FormUrlEncodedContent의 새 구현을 만드는 것이 해결책입니다.

public class MyFormUrlEncodedContent : ByteArrayContent 
{ 
    public MyFormUrlEncodedContent(IEnumerable<KeyValuePair<string, string>> nameValueCollection) 
     : base(MyFormUrlEncodedContent.GetContentByteArray(nameValueCollection)) 
    { 
     base.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded"); 
    } 
    private static byte[] GetContentByteArray(IEnumerable<KeyValuePair<string, string>> nameValueCollection) 
    { 
     if (nameValueCollection == null) 
     { 
      throw new ArgumentNullException("nameValueCollection"); 
     } 
     StringBuilder stringBuilder = new StringBuilder(); 
     foreach (KeyValuePair<string, string> current in nameValueCollection) 
     { 
      if (stringBuilder.Length > 0) 
      { 
       stringBuilder.Append('&'); 
      } 

      stringBuilder.Append(MyFormUrlEncodedContent.Encode(current.Key)); 
      stringBuilder.Append('='); 
      stringBuilder.Append(MyFormUrlEncodedContent.Encode(current.Value)); 
     } 
     return Encoding.Default.GetBytes(stringBuilder.ToString()); 
    } 
    private static string Encode(string data) 
    { 
     if (string.IsNullOrEmpty(data)) 
     { 
      return string.Empty; 
     } 
     return System.Net.WebUtility.UrlEncode(data).Replace("%20", "+"); 
    } 
} 

큰 콘텐츠를 보내려면 StreamContent을 사용하는 것이 좋습니다.

+0

.Net 4.0을 사용하고 있으며 UrlEncode() 메서드에 대한 액세스 권한이 없기 때문에이 솔루션을 사용할 수 없습니다. 직장 제한이나 다른 생각으로 인해 업그레이드 할 수 없습니까? – Muraad

+0

System.Web 종속성을 추가하여 비슷한 메서드 HttpUtility.UrlEncode를 찾을 수 있습니다. – Cybermaxs

+0

나에게 준 구현에는 FormUrlEcondedContent()와 동일한 제한이 있지만 이제는 예외를 throw하는 대신 서버에 게시하는 호출을 건너 뜁니다. – Muraad

0

은, 기본적으로는 포스트 데이터를 전송 "응용 프로그램/x-www-form-urlencoded를"HTTP 클라이언트를 통해 캐릭터의 컨텐츠 내에서,이

void sendDocument() 
    { 
     string url = "www.mysite.com/page.php"; 
     StringBuilder postData = new StringBuilder(); 
     postData.Append(String.Format("{0}={1}&", HttpUtility.HtmlEncode("prop"), HttpUtility.HtmlEncode("value"))); 
     postData.Append(String.Format("{0}={1}", HttpUtility.HtmlEncode("prop2"), HttpUtility.HtmlEncode("value2"))); 
     StringContent myStringContent = new StringContent(postData.ToString(), Encoding.UTF8, "application/x-www-form-urlencoded"); 
     HttpClient client = new HttpClient(); 
     HttpResponseMessage message = client.PostAsync(url, myStringContent).GetAwaiter().GetResult(); 
     string responseContent = message.Content.ReadAsStringAsync().GetAwaiter().GetResult(); 
    } 
+0

그러나 OP 문제는 많은 양의 데이터를 게시하고있었습니다. 귀하가 시연하지 않은 데이터는 이러한 방식으로 처리 될 수 있습니다. 그러나 나는'application/x-www-form-urlencoded'을 사용하면서 내용의 길이 제한이있는 것처럼 보이는'class FormUrlEncodedContent '를 사용하여 여러분이 무엇을하는지 보았다. – HankCa

관련 문제