C# 发送一个异步Post WebRequest,我得到所需的(411)长度

C# 发送一个异步Post WebRequest,我得到所需的(411)长度,c#,httpwebrequest,C#,Httpwebrequest,我正在使用下面的代码发布到一个网站,但我得到一个411错误( 远程服务器返回一个错误:(411)所需长度) 这就是我正在使用的函数,我刚刚删除了异常处理。我得到一个WebException被抛出 private static async Task<string> PostAsync(string url, string queryString, Dictionary<string, string> headers) { var webRequest = (HttpWe

我正在使用下面的代码发布到一个网站,但我得到一个411错误(
远程服务器返回一个错误:(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
  }
}
可以,但在某些情况下,我会得到长度错误的错误(因此它必须是0以外的值)

所以我的问题是,如何正确设置内容长度

而且,我是否正确发送我的
post
请求?还有别的办法吗


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

如果您使用的是
POST
,并且需要使用
POST
,那么您需要这个
数据
表示您发布的一些数据,无论是JSON、XML还是其他:

request.ContentLength = data.Length;

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

长度是写入请求流的数据的长度。因此,在此位中,设置
ContentLength

using (var writer = new StreamWriter(webRequest.GetRequestStream()))
{
  writer.Write(queryString);
  request.ContentLength = queryString.Length;
}
请注意,如果
queryString
包含unicode字符,您可能会遇到问题。
ContentLength
表示字节数,但
string.Length
表示字符数。由于某些unicode字符占用多个字节,因此可能存在不匹配。如果需要的话,有一些补偿的方法


作为替代,您可以使用。使用时,我不必手动设置ContentLength。

我认为可能还有更多,如果我做了您建议的更改,我现在得到“
System.Net.ProtocolViolationException:要写入流的字节数超过了指定的内容长度字节数。
”,是否需要在内容长度中包含标题长度?我将看一看HttpClient,这是“首选”方式吗?可能是字节与字符长度不匹配
HttpClient
现在是首选方式。在后面,它只是
HttpWebRequest
的包装器,但使用起来更简单。这里有一个解释:谢谢,但我似乎在寻找数据长度的实际值时遇到了一个问题。考虑到我的代码,您将如何计算“正确”的数据长度?您是否尝试了我提到的
GET
?是的,我现在正在测试它,并且不再出现错误(我仍在测试)。但是我必须承认,我想理解为什么POST不起作用,它没有真正的意义。如果服务器端将调用限制为仅
GET
,那么
POST
将不起作用。当然,但它会给我一个不同的错误,(我怀疑)。
using (var writer = new StreamWriter(webRequest.GetRequestStream()))
{
  writer.Write(queryString);
  request.ContentLength = queryString.Length;
}