2014-01-16 8 views
5

Bei der Verwendung von WebRequest zu senden POST wird der Authorization-Header nicht mit der Anforderung zu senden, auch gesendet, obwohl ich manuell den Header und setzen PreAuthenticate auf true, zB festgelegt haben:Wie WebRequest erzwingen Authorization-Header während des POST

webRequest.Headers["Authorization"] = "OAuth oauth_consumer_key=bFPD..."; 
webRequest.PreAuthenticate = true; 

Mit Fiddler kann ich sehen, dass die Autorisierung Header nicht gesendet wird. Die Zielwebsite (Twitter) gibt eine 400 (ungültige Anforderung) anstelle einer 401 (nicht autorisiert) zurück. Dies ist daher die falsche Anforderung, die erforderlich ist, damit WebRequest die Berechtigungsdaten senden kann. Für Informationen ist der zurückgegebene Inhalt:

{"errors":[{"message":"Bad Authentication data","code":215}]} 

Also, wie komme ich um diese? Wie kann ich WebRequest zwingen, die Autorisierung mit einer ersten Anfrage zu senden? Beachten Sie, dass die Autorisierungsdaten keine Standardauthentifizierung sind, sondern eine OAuth-Zeichenfolge.

Dank

+0

Siehe [diese andere Frage] (http://stackoverflow.com/questions/2764577/forcing-basic-authentication-in-webrequest). –

Antwort

1

Versuchen Sie dieses, aber es sollte kein Raum zwischen den Berechtigungs Header sein.

var authHeader = "OAuth oauth_consumer_key=bFPD..."; 
webRequest.Headers.Add("Authorization", authHeader); 
+0

Das funktioniert nicht (ich denke, es hat genau die gleiche Wirkung wie der Code oben). Beachten Sie, dass der Berechtigungsheader korrekt ist (mit Leerzeichen), da er mit einem GET, aber nicht mit einem POST funktioniert. – chris

2

Das trieb mich bonkers, aber schließlich fand die Antwort in Adding Headers and Post data in RESTfull/HTTP Request in C#.

Die Lösung für mich war das Hinzufügen der Authorization Header VOR dem Schreiben des Anfrage-Stream.

Hoffe, das hilft.

+0

Ich kann es nicht glauben! Du beherrschst .... all die komplizierten Antworten und das ist die WIRKLICHE Antwort! Danke Mann .. – CodeHacker

9

Hier ist meine Lösung. Der Wert ist in der Variablen json.

var myUri = new Uri(fullpath); 
var myWebRequest = WebRequest.Create(myUri); 
var myHttpWebRequest = (HttpWebRequest)myWebRequest; 
myHttpWebRequest.PreAuthenticate = true; 
myHttpWebRequest.Headers.Add("Authorization", "Bearer " + AccessToken); 
myHttpWebRequest.Accept = "application/json"; 

var myWebResponse = myWebRequest.GetResponse(); 
var responseStream = myWebResponse.GetResponseStream(); 
if (responseStream == null) return null; 

var myStreamReader = new StreamReader(responseStream, Encoding.Default); 
var json = myStreamReader.ReadToEnd(); 

responseStream.Close(); 
myWebResponse.Close(); 
+0

Was die Myuri in Ihrem Code .... –

+0

myUri ist in der vorherigen Zeile erstellt. Senden Sie einfach die vollständige Webadresse. – JuanPablo

+0

Ich habe die Zeile 'myHttpWebRequest.PreAuthenticate = true;' vermisst. Danke, scheint nicht ohne zu arbeiten, auch wenn wir den Auth-Header hinzufügen – FindOutIslamNow