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);
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
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. –
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