2016-11-08 8 views
2

Я вызываю следующую функцию, чтобы получить токен доступа для получения профиля пользователя Twitter с помощью REST Api.Метод HttpClient.SendAsync выходит из исключения без исключения

public async Task<string> GetAccessToken() 
    { 
     try 
     { 
      var httpClient = new HttpClient(); 
      var request = new HttpRequestMessage(HttpMethod.Post, "https://api.twitter.com/oauth2/token "); 
      var customerInfo = Convert.ToBase64String(new UTF8Encoding().GetBytes(OAuthConsumerKey + ":" + OAuthConsumerSecret)); 
      request.Headers.Add("Authorization", "Basic " + customerInfo); 
      request.Content = new StringContent("grant_type=client_credentials", Encoding.UTF8, "application/x-www-form-urlencoded"); 

      //program exits at this point 
      HttpResponseMessage response = await httpClient.SendAsync(request).ConfigureAwait(false); 
      string json = await response.Content.ReadAsStringAsync(); 
      var serializer = new JavaScriptSerializer(); 
      dynamic item = serializer.Deserialize<object>(json); 
      return item["access_token"]; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("In Retrieving access token : " + ex.ToString()); 
     } 

    } 

выхода из программы/завершается без получения ответа в точке HttpResponseMessage response = await httpClient.SendAsync(request).ConfigureAwait(false); называется.

Это родительская функция, которая вызывает GetAccessToken()

public async Task getUserProfile(string userName) 
    { 
     try 
     { 
      if (accessToken == null) 
      { 
       accessToken = await GetAccessToken().ConfigureAwait(false); 
      } 

      var request = new HttpRequestMessage(HttpMethod.Get, string.Format(" https://api.twitter.com/1.1/users/show.json?screen_name={0}", userName)); 
      request.Headers.Add("Authorization", "Bearer " + accessToken); 
      var httpClient = new HttpClient(); 
      HttpResponseMessage response = await httpClient.SendAsync(request).ConfigureAwait(false); 
      var jsonString = await response.Content.ReadAsStringAsync(); 

      var serializer = new JavaScriptSerializer(); 
      dynamic jsonObj = serializer.Deserialize<object>(jsonString); 

     } 

     catch (Exception ex) 
     { 
      if (DEBUG) 
      { 
       MessageBox.Show("In Retrieving user profile from twitter : " + ex.ToString()); 
      } 

     } 

    } 

Я не может поймать исключение, почему программа выходит на GetAccessToken() или getUserProfile(). Но код выполняется успешно и получает HttpResponseMessage, если getUserProfile() имеет Task<IEnumerable<string>> как возвращаемый тип. Почему эта проблема возникает? Как можно исключить исключение?

+0

Как вы сказали, что ваш метод является асинхронным ... Исключение происходит, когда задача будет выполнена/завершена. Вам нужно использовать метод async или нет? – mtheriault

+0

Можете ли вы показать код, вызывающий 'getUserProfile'? Что это за приложение? –

+0

Вам интересно, почему вы используете JavaScriptSerializer? Microsoft [documentation] (https://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer), в котором говорится: «Json.NET следует использовать для сериализации и десериализации. и десериализации для приложений с поддержкой AJAX. " – sellotape

ответ

-2

Вы пробовали

HttpResponseMessage response = httpClient.SendAsync(request).Result; 

У меня такая же проблема в моем собственном коде, и это, похоже, закрепилась это, должно быть эквивалентно первоначальному вызову. Тем не менее, я все еще не понимаю первопричины аварии.

2

Ваша заявка завершается, потому что вы не ожидаете завершения getUserProfile(). Вы можете отметить getTwitterInfo в асинхронном похож на других или сказать ему, чтобы ждать задачи закончить

public async Task getTwitterInfo() { 
    var twitter = new Twitter("consumerKey","consumerSecret"); 
    await twitter.getUserProfile(userName); 
} 

ИЛИ

public void getTwitterInfo() { 
    var twitter = new Twitter("consumerKey","consumerSecret"); 
    var task = twitter.getUserProfile(userName); 
    var result = task.WaitAndUnwrapException(); 
} 
+0

Спасибо. Я тоже определил проблему и решил ее так: var userProfile = twitter.getUserProfile (userName) .Result() ' – Sree