2013-08-21 23 views
33

ten sposób wzywam serwis z .NET:Dlaczego pojawia się błąd wymagający długości 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(); 

ale gdy ta metoda jest wywoływana, otrzymuję:

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

co mam zrobić?

Odpowiedz

54

Kiedy używasz metody HttpWebRequest i POST, musisz ustawić zawartość (lub ciało, jeśli wolisz) za pośrednictwem żądania RequestStream. Ale zgodnie z twoim kodem, używanie authRequest.Method = "GET" powinno wystarczyć.

W przypadku zastanawiasz się o formacie POST, oto co trzeba zrobić:

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

Czy możesz odnieść się do mojego pytania "http://stackoverflow.com/questions/35308945/accessing-sftp-url-from-console-application-using-c-sharp"? Mam podobny problem. Próbuję trafić URL SFTP –

8

Po dokonaniu POST HttpWebRequest, należy określić długość danych wysyłanego, coś jak:

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

jeśli nie wysyła żadnych danych, po prostu ustawić go na 0, to oznacza, że wystarczy dodać do tego wiersza kodu:

request.ContentLength = 0; 

Zazwyczaj, jeśli nie wysyła żadnych danych, chosing metoda GET zamiast jest mądrzejszy, jak widać w HTTP RFC

+0

dziękuję Lott ... to będzie przydatne dla mnie –

+1

Chociaż zwykle można by oczekiwać danych przesyłanych z POST, byłoby błędne i złe praktyki w użyciu GET, gdy jesteś * modyfikowanie * danych na serwerze. Żądanie POST powinno unikać wszelkich buforów pośredniczących między klientem a serwerem. GET jest w porządku, jeśli dane są pobierane z serwera bez intencji jakichkolwiek zmian na serwerze w wyniku żądania. – Michael

17

trzeba dodać Content-Length: 0 w nagłówku żądania.

bardzo opisowy przykład jak testować podano here

+0

Tak, dodając długość treści: 0 pomogło. Dzięki! – 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

Hej Używam Volley i był coraz błąd serwera 411 , Dodałem do metody getHeaders następujący lin e:

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

I rozwiązać mój problem

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

Obiekt ContentLength zawiera wartość wysyłania jako nagłówek HTTP Content-length z wnioskiem.

Dowolna wartość inna niż -1 w obiekcie ContentLength wskazuje, że dane żądania przesłane i że tylko metody, które przesyłać dane mogą być ustawione w nieruchomości Method.

Po własnością ContentLength jest ustawiona na wartość, że liczba bajtów musi być napisana do strumienia żądanie, który jest zwracany przez wywołanie metody GetRequestStream albo zarówno BeginGetRequestStream oraz metody EndGetRequestStream.

wiecej informacji kliknij here

Powiązane problemy