发送Async Post WebRequest,我得到(411)长度要求

时间:2017-05-27 04:55:40

标签: c# httpwebrequest

我使用下面的代码发布到网站但我收到411错误,( The remote server returned an error: (411) Length Required

这是我正在使用的功能,我刚刚删除了异常处理。我被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)。

2 个答案:

答案 0 :(得分:1)

如果您使用POST并且需要使用POST,则需要使用data代表您发布的一些数据,无论是JSON,XML还是其他:

request.ContentLength = data.Length;

话虽如此,我认为您可能会使用GET,因为您不会在请求正文中发送任何内容。但在某些情况下,您别无选择,只能使用POST

答案 1 :(得分:1)

长度是您写入请求流的数据的长度。所以在这一位,设置ContentLength

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

请注意,如果queryString包含unicode字符,则可能会遇到问题。 ContentLength表示字节数,但string.Length表示字符数。由于某些unicode字符占用多个字节,因此可能存在不匹配。如果需要,有办法补偿。

作为替代方案,您可以改用HttpClient。我没有必要在使用时手动设置ContentLeng。