2015-04-17 26 views
15

Moje bieżące zadanie polega na użyciu RESTful API z OAuth2. Obecnie pracowałem, jak zdobyć token dostępu i działa dobrze, gdy używam rozszerzenia Chrome Rest Console, ale kiedy próbuję zrobić to z mojej aplikacji, zawsze otrzymuję błąd, że wysyłam nieprawidłowe żądanie OAuth. Poniżej przedstawiamy trzy sposoby, w jakie próbowałem skonsumować API, ale bez powodzenia. Strona zawsze zwraca błąd 500. Każda pomoc zostanie doceniona, jeśli przeoczyłem coś kluczowego.Błąd 500 z autoryzacją podczas korzystania z usługi RESTful OAuth2 przez 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 --------

Na pierwszej próbie Próbowałem też dodać do uwierzytelniania klienta zmiennej client.Authenticator = Authenticate; gdzie OAuth2AuthorizationRequestHeaderAuthenticator Authenticate = new OAuth2AuthorizationRequestHeaderAuthenticator(item.access_token, item.token_type);

+0

Czy naprawdę używasz 'var auth =" Bearer "+ item.access_token;' zamiast identyfikatora klienta i tajnego dla pobierania tokena? Skąd się wzięło hasło access_token, skoro można uzyskać tylko kod autoryzacyjny? Możesz także spróbować pominąć nagłówki "Pragma", "User-Agent" i "Accept", które mogą nie być potrzebne tutaj. – GeorgDangl

+0

Czy próbowałeś kliknąć prawym przyciskiem myszy "References" w eksploratorze rozwiązań i używając "Add Service Reference"? Może to być bardzo pomocne i skrócić czas kodowania. –

+0

item.accesss_token jest już wcześniej adresowany do innej części tego samego API przy użyciu Drugiej Próby zapisanej w moim kodzie. Jest on poprawnie przetwarzany i jeśli użyję tokenu, który otrzymałem z Konsoli Rest., Api działa zgodnie z oczekiwaniami. Próbowałem bez dodatkowych nagłówków, ale nie robiłem żadnej różnicy. Czytałem gdzieś, że mogę przekazać access_token przez adres URL, więc próbowałem - nie działa. – user2227904

Odpowiedz

2

Kod wydaje się być właściwy. Próby niepowodzenia, które zrobiłeś, sugerują, że problem dotyczy tokena, a nie kodu. Znaczniki na okaziciela mają czas wygaśnięcia. Semms jak twój token wygasł pomiędzy pierwszym razem, gdy masz go za pomocą chrome REST Console extension i kiedy napisałeś swój kod. Ale dziwna sytuacja to kod błędu 500, który masz. 401 to standardowa odpowiedź, gdy token wygasł lub nie istnieje. Kod błędu 500 zawsze oznacza błąd serwera.

+0

Dziękuję za szybką odpowiedź, ale token nie stanowi problemu. Dwie operacje są wykonywane jedna po drugiej. Właśnie dostałem token i próbuję zażądać danych z API, również jeśli użyję tego samego tokena, którego używałem w tym żądaniu w RestConsole (rozszerzenie Chrome), pobiera dane poprawnie. Również przechwyciłem 2 żądania z Wireshark, ale nie widziałem żadnych różnic, więc myślę, że może być coś nie tak z moim kodem. – user2227904