2017-05-27 46 views
1

我使用下面的代碼發佈到一個網站,但我得到一個411錯誤,( The remote server returned an error: (411) Length Required發送一個異步的WebRequest後,我得到了(411)需要長度

這是我正在使用的函數,我只是刪除了異常處理。我得到了一個WebException被拋出。

private static async Task<string> PostAsync(string url, string queryString, Dictionary<string, string> headers) 
{ 
    var webRequest = (HttpWebRequest)WebRequest.Create(url); 
    webRequest.ContentType = "application/x-www-form-urlencoded"; 
    webRequest.Method = "POST"; 
    if (headers != null) 
    { 
    foreach (var header in headers) 
    { 
     webRequest.Headers.Add(header.Key, header.Value); 
    } 
    } 

    if (!string.IsNullOrEmpty(queryString)) 
    { 
    queryString = BuildQueryString(query); 
    using (var writer = new StreamWriter(webRequest.GetRequestStream())) 
    { 
     writer.Write(queryString); 
    } 
    } 

    //Make the request 
    try 
    { 
    using (
     var webResponse = await Task<WebResponse>.Factory.FromAsync(webRequest.BeginGetResponse, webRequest.EndGetResponse, webRequest).ConfigureAwait(false)) 
    { 
     using (var str = webResponse.GetResponseStream()) 
     { 
     if (str != null) 
     { 
      using (var sr = new StreamReader(str)) 
      { 
      return sr.ReadToEnd(); 
      } 
     } 
     return null; 
     } 
    } 
    } 
    catch (WebException wex) 
    { 
    // handle webexception 
    } 
    catch (Exception ex) 
    { 
    // handle webexception 
    } 
} 

我看到一些網站上,加入

webRequest.ContentLength = 0; 

會的工作,但在某些情況下,我得到錯誤的長度是錯誤的,(因此它必須是0以外的東西)。

所以我的問題是,如何正確設置內容長度?

而且,我是否正確地發送我的post請求?有另一種方法嗎?

不確定它是否重要,但我使用的是.NET 4.6,(但如果需要,我可以使用4.6.1)。

回答

1

長度是您寫入請求流的數據的長度。所以在這一點,設置ContentLength

using (var writer = new StreamWriter(webRequest.GetRequestStream())) 
{ 
    writer.Write(queryString); 
    request.ContentLength = queryString.Length; 
} 

請注意,你可能有麻煩,如果queryString包含Unicode字符。 ContentLength表示字節數,但string.Length表示字符數。由於某些unicode字符佔用了多個字節,因此可能會有不匹配。有些方法可以在需要時進行補償。

作爲替代,您可以使用HttpClient來代替。使用它時,我不必手動設置ContentLength。

+0

我認爲可能還有更多,如果我做出你所建議的改變,我現在得到「System.Net.ProtocolViolationException:要寫入流的字節超過指定的Content-Length字節大小。」,我需要在內容長度中包含標題長度?我會看看HttpClient,這是'優先'的方式嗎? –

+0

然後可能是字節與字符長度不匹配。 'HttpClient'是現在的首選方式。在後面,它僅僅是'HttpWebRequest'的包裝,但使用更簡單。這裏有一個解釋:http://www.diogonunes。COM /博客/ Web客戶端-VS-HttpClient的-VS-的HttpWebRequest / –

1

如果您正在使用POST,你需要使用POST那麼你需要這個地方data代表了一些數據,你要留言無論是JSON,XML或什麼:

request.ContentLength = data.Length; 

話雖如此,我認爲你是可能與使用GET相關,因爲您並未在請求的正文中發送任何內容。但在某些情況下,您別無選擇,只能使用POST

+0

謝謝,但我似乎有一個問題,發現數據的長度實際上是什麼。鑑於我的代碼,你將如何計算'正確'的數據長度? –

+0

您是否嘗試過像我剛纔提到的GET? – CodingYoshi

+0

是的,我現在正在測試它,並且我不會再出錯,(我仍在測試)。但我必須承認,我想了解爲什麼POST不起作用,這並不合理。 –

相關問題