web-dev-qa-db-ja.com

411 Length requiredエラーが発生するのはなぜですか?

これは、.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();

しかし、このメソッドが呼び出されると、次のようになります:

例外の詳細:System.Net.WebException:リモートサーバーがエラーを返しました:(411)長さが必要です。

私は何をすべきか?

48
markzzz

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;
73
Atlasmaybe

リクエストヘッダーにContent-Length: 0を追加する必要があります。

テスト方法の非常に説明的な例が与えられます here

25
Ehsan

POST HttpWebRequestを作成する場合、送信するデータの長さを次のように指定する必要があります。

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

データを送信しない場合は、0に設定するだけです。つまり、次の行にコードを追加するだけです。

request.ContentLength = 0;

通常、データを送信しない場合、 HTTP RFC でわかるように、代わりにGETメソッドを選択する方が賢明です。

13
Save
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ヘッダーとして送信する値が含まれます。

ContentLengthプロパティの-1以外の値は、リクエストがデータをアップロードし、データをアップロードするメソッドのみがMethodプロパティで設定できることを示します。

ContentLengthプロパティを値に設定した後、そのバイト数を、GetRequestStreamメソッドまたはBeginGetRequestStreamメソッドとEndGetRequestStreamメソッドの両方を呼び出して返される要求ストリームに書き込む必要があります。

詳細については、 こちら をクリックしてください

3

メソッドのリクエスト方法をPOSTからGETに変更します。

1
Solomon Thomas

ちょっと私はVolleyを使用していて、サーバーエラー411を受け取っていたので、getHeadersメソッドに次の行を追加しました。

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

そしてそれは私の問題を解決しました

1
shimi_tap

Google検索

2番目の結果

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

これは、POSTを介してRESTベースのAPIメソッドを呼び出そうとすると発生する非常に一般的な問題です。幸いなことに、これには簡単な修正があります。

これは、Windows Azure管理APIを呼び出すために使用していたコードです。この特定のAPI呼び出しでは、要求メソッドをPOSTとして設定する必要がありますが、サーバーに送信する必要のある情報はありません。

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

このエラーを修正するには、API呼び出しを行う前に、明示的なコンテンツの長さをリクエストに追加します。

request.ContentLength = 0;

0
iabbott

Web要求をフィドラーキャプチャセッションからVisual Studio Webテストにインポートしたときにも同じエラーが発生しました。一部のPOSTリクエストには、StringHttpBodyタグがありませんでした。空のものを追加しましたが、エラーはなくなりました。これをヘッダータグの後に追加します。

    <StringHttpBody ContentType="" InsertByteOrderMark="False">
  </StringHttpBody>
0