我使用下面的代码发布到网站但我收到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)。
答案 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。