为什么我得到411长度所需的错误?

mar*_*zzz 49 .net c# httprequest http-status-code-411

这就是我用.NET调用服务的方式:

var requestedURL = "https://accounts.google.com/o/oauth2/token?code=" + code + "&client_id=" + client_id + "&client_secret=" + client_secret + "&redirect_uri=" + redirect_uri + "&grant_type=authorization_code";
HttpWebRequest authRequest = (HttpWebRequest)WebRequest.Create(requestedURL);
authRequest.ContentType = "application/x-www-form-urlencoded";
authRequest.Method = "POST";
WebResponse authResponseTwitter = authRequest.GetResponse();
Run Code Online (Sandbox Code Playgroud)

但是当调用此方法时,我得到:

异常详细信息:System.Net.WebException:远程服务器返回错误:(411)Length Required.

我该怎么办?

Atl*_*ybe 74

当您使用HttpWebRequest和POST方法时,您必须通过RequestStream设置内容(或者您喜欢的正文).但是,根据您的代码,使用authRequest.Method ="GET"就足够了.

如果您对POST格式感到疑惑,请执行以下操作:

ASCIIEncoding encoder = new ASCIIEncoding();
byte[] data = encoder.GetBytes(serializedObject); // a json object, or xml, whatever...

HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = data.Length;
request.Expect = "application/json";

request.GetRequestStream().Write(data, 0, data.Length);

HttpWebResponse response = request.GetResponse() as HttpWebResponse;
Run Code Online (Sandbox Code Playgroud)


Ehs*_*san 25

您需要添加Content-Length: 0请求标头.

这里给出一个如何测试的非常具有描述性的例子


Sav*_*ave 13

制作POSTHttpWebRequest时,必须指定要发送的数据的长度,例如:

string data = "something you need to send"
byte[] postBytes = Encoding.ASCII.GetBytes(data);
request.ContentLength = postBytes.Length;
Run Code Online (Sandbox Code Playgroud)

如果您没有发送任何数据,只需将其设置为0,这意味着您只需要在此行中添加以下代码:

request.ContentLength = 0;
Run Code Online (Sandbox Code Playgroud)

通常,如果您没有发送任何数据,那么选择GET方法会更明智,正如您在HTTP RFC中看到的那样

  • 虽然通常人们希望数据通过 POST 发送,但当您*修改*服务器上的数据时使用 GET 将是不正确和不好的做法。POST 请求应避免客户端和服务器之间的任何代理缓存。如果从服务器获取数据而无意因请求而在服务器上进行任何更改,则 GET 是可以的。 (2认同)