2015-04-17 7 views
15

konsumieren Meine aktuelle Aufgabe ist es, eine RESTful API mit OAuth2 zu konsumieren. Momentan habe ich herausgefunden, wie ich das Access Token bekomme und es funktioniert ok, während ich die Chrome-Extension Rest Console verwende, aber wenn ich versuche, es aus meiner Anwendung zu tun, bekomme ich immer den Fehler, dass ich eine ungültige OAuth Anfrage sende. Im Folgenden finden Sie drei Möglichkeiten, wie ich versucht habe, die API zu verwenden, aber keinen Erfolg. Die Seite gibt immer Fehler 500 zurück. Jede Hilfe wird geschätzt, wenn ich etwas Entscheidendes verpasst habe.Fehler 500 mit Autorisierung während OAuth2 RESTful-Dienst über C#

var auth = "Bearer " + item.access_token; 


    /* First Attempt */ 
    var client = new RestClient("http://<link>"); 
    var request = new RestRequest("sample", Method.GET); 
    request.AddHeader("Authorization", auth); 
    request.AddHeader("Content-Type", "application/json;charset=UTF-8"); 
    request.AddHeader("Pragma", "no-cache"); 
    request.AddHeader("User-Agent", "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36"); 
    request.AddHeader("Accept", "application/json"); 
    request.RequestFormat = DataFormat.Json; 
    var response = client.Execute(request); 
    var content = response.Content; 





    /* Second Attempt */ 
    string sURL = "http://<link>/sample"; 

    string result = ""; 

    using (WebClient client = new WebClient()) 
    { 
     client.Headers["Authorization"] = auth; 
     client.Headers["Content-Type"] = "application/json;charset=UTF-8"; 
     client.Headers["Pragma"] = "no-cache"; 
     client.Headers["User-Agent"] = "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36"; 
     client.Headers["Accept"] = "application/json"; 

     byte[] byteArray = Encoding.UTF8.GetBytes(parameters); 

     var result1 = client.DownloadString(sURL); 
    } 


    /* Third Attempt */ 
    var request = (HttpWebRequest)WebRequest.Create(sURL); 
    request.Method = "GET"; 
    request.ContentType = "application/json;charset=UTF-8"; 
    request.Accept = "application/json"; 
    request.Headers["Authorization"] = auth; 
    request.UserAgent = "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36"; 
    string content; 
    HttpStatusCode statusCode; 
    using (var response = request.GetResponse()) 
    using (var stream = response.GetResponseStream()) 
    { 
     var contentType = response.ContentType; 
     Encoding encoding = null; 
     if (contentType != null) 
     { 
      var match = Regex.Match(contentType, @"(?<=charset\=).*"); 
      if (match.Success) 
       encoding = Encoding.GetEncoding(match.ToString()); 
     } 

     encoding = encoding ?? Encoding.UTF8; 

     statusCode = ((HttpWebResponse)response).StatusCode; 
     using (var reader = new StreamReader(stream, encoding)) 
      content = reader.ReadToEnd(); 
    } 

-------- -------- EDIT

für den ersten Versuch habe ich versucht, auch die Authentifizierung an die Client-variable client.Authenticator = Authenticate; wo OAuth2AuthorizationRequestHeaderAuthenticator Authenticate = new OAuth2AuthorizationRequestHeaderAuthenticator(item.access_token, item.token_type);

+0

Sollten Sie wirklich 'var auth =" Bearer "+ item.access_token;' anstelle des Kennzeichens und des Geheimnisses Ihres Clients für den Tokenabruf verwenden? Woher kam das access_token, wenn Sie nur den Autorisierungscode bekommen können? Sie könnten auch versuchen, Ihre Header "Pragma", "User-Agent" und "Accept" wegzulassen, sie sind hier möglicherweise nicht notwendig. – GeorgDangl

+0

Haben Sie versucht, in Ihrem Lösungsexplorer mit der rechten Maustaste auf "Referenzen" zu klicken und "Service-Referenz hinzufügen" zu verwenden? Es kann eine große Hilfe sein und Ihre Programmierzeit reduzieren. –

+0

item.access_token wird früher mit einem anderen Teil der gleichen API angesprochen, wobei der zweite Versuch in meinen Code geschrieben wird. Es wird korrekt geparst und wenn ich das Token benutze, das ich mit Rest Console bekommen habe, funktioniert die API wie erwartet. Ich habe es ohne die zusätzlichen Header versucht, aber das machte keinen Unterschied. Ich habe irgendwo gelesen, dass ich das Access_Token durch die URL weitergeben kann, also habe ich das versucht - hat nicht funktioniert. – user2227904

Antwort

2

hinzuzufügen Der Code scheint richtig zu sein. Bei den fehlgeschlagenen Versuchen haben Sie vorgeschlagen, dass das Problem mit dem Token und nicht mit dem Code zu tun hat. Inhaber-Tokens haben Ablaufzeit. Also simms wie Ihr Token abgelaufen zwischen dem ersten Mal, als Sie es mit Chrome REST Console-Erweiterung und wenn Sie Ihren Code geschrieben haben. Aber die seltsame Situation hier ist der 500 Fehlercode, den Sie bekommen haben. 401 ist die Standardantwort, wenn das Token abgelaufen ist oder nicht existiert. 500 Fehlercode bedeuten immer Serverfehler.

+0

Vielen Dank für die schnelle Antwort, aber das Token ist nicht das Problem. Die zwei Operationen werden nacheinander ausgeführt. Ich habe gerade das Token und versuche, die Daten von der API anzufordern, auch wenn ich das gleiche Token verwende, das ich mit dieser Anfrage in RestConsole (Chrome-Erweiterung) verwendet habe, zieht es die Daten korrekt. Auch habe ich die 2 Anfragen mit Wireshark erfasst, aber ich konnte keine Unterschiede sehen, daher denke ich, dass etwas mit meinem Code nicht stimmt. – user2227904