2013-08-21 33 views
33

Đây là cách tôi gọi một dịch vụ với NET:Tại sao tôi nhận được lỗi 411 Độ dài bắt buộc?

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

nhưng khi phương pháp này được gọi, tôi nhận được:

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

những gì tôi nên làm gì?

Trả lời

54

Khi bạn đang sử dụng phương thức HttpWebRequest và POST, bạn phải đặt nội dung (hoặc một phần nội dung nếu bạn thích) thông qua RequestStream. Nhưng, theo mã của bạn, sử dụng authRequest.Method = "GET" là đủ.

Trong trường hợp bạn đang tự hỏi về định dạng POST, đây là những gì bạn phải làm:

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

Bạn có thể tham khảo câu hỏi của tôi "http://stackoverflow.com/questions/35308945/accessing-sftp-url-from-console-application-using-c-sharp" không? Tôi đang gặp vấn đề tương tự. Tôi đang cố gắng truy cập URL SFTP –

8

Khi bạn thực hiện một POST HttpWebRequest, bạn phải xác định độ dài của dữ liệu bạn đang gửi, một cái gì đó như:

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

nếu bạn không gửi bất kỳ dữ liệu, chỉ cần đặt nó là 0, có nghĩa là bạn chỉ phải thêm vào mã của bạn dòng này:

request.ContentLength = 0; 

Thông thường, nếu bạn không gửi bất kỳ dữ liệu, chosing phương pháp GET thay vào đó là khôn ngoan hơn, như bạn có thể nhìn thấy trong HTTP RFC

+0

nhờ một lott ... nó sẽ hữu ích cho tôi –

+1

Trong khi phong tục người ta sẽ mong đợi dữ liệu được gửi đi với một POST, nó sẽ được thực hành không chính xác và xấu để sử dụng GET khi bạn đang * sửa đổi * dữ liệu trên máy chủ. Yêu cầu POST nên tránh mọi bộ đệm proxy giữa máy khách và máy chủ. GET là okay nếu dữ liệu đang được lấy từ máy chủ mà không có ý định bất cứ điều gì thay đổi trên máy chủ như là kết quả của yêu cầu. – Michael

17

bạn cần phải thêm Content-Length: 0 trong tiêu đề yêu cầu của bạn.

một ví dụ rất mô tả làm thế nào để kiểm tra được đưa ra here

+0

Có, thêm Nội dung dài: 0 đã giúp. Cảm ơn! – 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

Hey Tôi đang sử dụng Volley và đã nhận được máy chủ lỗi 411 , Tôi đã thêm vào phương thức getHeaders e:

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

Và nó giải quyết vấn đề của tôi

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

Thuộc tính ContentLength chứa giá trị để gửi như tiêu đề Content-length HTTP với yêu cầu.

Bất kỳ giá trị khác hơn -1 trong ContentLength tài sản chỉ ra rằng dữ liệu yêu cầu cập nhật và phương pháp duy nhất mà tải lên dữ liệu được phép thiết lập trong tài sản Method.

Sau khi tài sản ContentLength được đặt thành một giá trị, mà số byte phải được ghi vào dòng yêu cầu được trả lại bằng cách gọi GetRequestStream phương pháp hoặc cả BeginGetRequestStreamEndGetRequestStream phương pháp.

để biết thêm chi tiết nhấp here