2016-04-08 62 views
0

我正在嘗試加載推文,但使用我的MVC應用時我的代碼無法正常工作。但是,使用控制檯時確切的代碼工作正常。在MVC中獲取推文

我認爲這是與「異步」有關,我以前沒有使用過這方面的經驗,我無法找到解決方案。後破發點 「GetAccessToken()」 不打

在我的Controler:

public ActionResult Tweets(int tweets, string username) 
    { 
     var twitter = new Twitter(); 

     var userTweets = twitter.GetTweets("chrishall9521", 10).Result.ToList(); 

     this.ViewBag.Tweets = userTweets; 

     return View(); 
    } 

在我的 「推特」 類:

public async Task<IEnumerable<string>> GetTweets(string userName, int count) 
    { 
     var accessToken = await GetAccessToken(); 
     var requestUserTimeline = new HttpRequestMessage(HttpMethod.Get, string.Format("https://api.twitter.com/1.1/statuses/user_timeline.json?count={0}&screen_name={1}&trim_user=1&exclude_replies=1", count, userName)); 
     requestUserTimeline.Headers.Add("Authorization", "Bearer " + accessToken); 
     var httpClient = new HttpClient(); 
     HttpResponseMessage responseUserTimeLine = await httpClient.SendAsync(requestUserTimeline); 
     var serializer = new JavaScriptSerializer(); 
     dynamic json = serializer.Deserialize<object>(await responseUserTimeLine.Content.ReadAsStringAsync()); 
     var enumerableTwitts = (json as IEnumerable<dynamic>); 

     if (enumerableTwitts == null) 
     { 
      return null; 
     } 

     return enumerableTwitts.Select(t => (string)(t["text"].ToString())); 
    } 

    public async Task<string> GetAccessToken() 
    { 
     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"); 

     var 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"]; 
    } 
+0

@eh。這樣可行!乾杯隊友,大量的幫助! – Chris

+0

爲了正確地感謝@eh,請點擊Answer和upvote箭頭旁邊的複選標記,以及:-) –

回答

2

不要使用.Result這樣的 - 你」重新陷入僵局。改用Tweets方法中的await,並使其爲async。使用async的基本「黃金法則」是,當您使用它時,您可以一直使用它。

這裏是一個blog post與進一步閱讀類似的例子。