2013-08-21 19 views
33

これは私が.NETでサービスを呼び出す方法です:なぜ411長さのエラーが発生するのですか?

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(); 

が、このメソッドが呼び出されたときに、私が取得:

Exception Details: System.Net.WebException: The remote server returned an error: (411) Length Required.

私は何をすべき?

答えて

54

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; 
+0

私の質問 "http://stackoverflow.com/questions/35308945/accessing-sftp-url-from-console-application-using-c-sharp"を参照してください。私も同様の問題を抱えています。私はSFTP URLをヒットしようとしています –

8

あなたがPOST HttpWebRequestのを作るとき、あなたは、何かあなたが送信されたデータの長さを指定する必要があります:あなたはあなたを意味し、ちょうど0に設定し、任意のデータを送信していない場合

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

は、ちょうどあなたのコードに次の行を追加する必要があります。通常

request.ContentLength = 0; 

、あなたが代わりにGET方法を択一、任意のデータを送信していない場合は、HTTP RFC

で見ることができるよう、賢明です
+0

おかげでロットをクリックしてください...便利な私のために –

+1

は、それはあなたがしている時にGETを使用するには正しくないと悪い習慣になりますサーバーの*変更*データ。 POST要求は、クライアントとサーバー間のプロキシ・キャッシュを回避する必要があります。要求の結果としてサーバー上で何か変更が行われることを意図せずに、サーバーからデータがフェッチされている場合は、GETは問題ありません。 – Michael

17

あなたのリクエストヘッダにContent-Length: 0を追加する必要があります。テストする方法の

非常にわかりやすい例が、ちょっと私はバレーボールを使用していますし、サーバーエラー411を得ていたhere

+0

はい、Content-Length:0を追加しました。ありがとう! – Roboblob

1

Google search

2nd result

System.Net.WebException: The remote server returned an error: (411) Length Required. 

This is a pretty common issue that comes up when trying to make call a REST based API method through POST. Luckily, there is a simple fix for this one.

This is the code I was using to call the Windows Azure Management API. This particular API call requires the request method to be set as POST, however there is no information that needs to be sent to the server.

var request = (HttpWebRequest) HttpWebRequest.Create(requestUri); 
request.Headers.Add("x-ms-version", "2012-08-01"); request.Method = 
"POST"; request.ContentType = "application/xml"; 

To fix this error, add an explicit content length to your request before making the API call.

request.ContentLength = 0;

1

与えられ、 、私はgetHeadersメソッドに次のlinを追加しましたE:

params.put("Content-Length","0"); 

そして、それは

2
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"; 
//Set content length to 0 
authRequest.ContentLength = 0; 
WebResponse authResponseTwitter = authRequest.GetResponse(); 

私の問題を解決しContentLengthプロパティは、リクエストにContent-length HTTPヘッダとして送信する値を含みます。

-1以外の値は、要求がデータをアップロードし、データをアップロードするメソッドだけがMethodプロパティで設定できることを示します。

ContentLengthプロパティが値に設定された後、バイトの数は、GetRequestStream方法又はBeginGetRequestStream両方EndGetRequestStreamメソッドを呼び出すことによって返されたリクエストストリームに書き込まれなければなりません。通例1は、データがPOSTで送信されることを期待するだろうが

詳細はhere

関連する問題