2016-12-21 17 views
4

HttpClientを使用してASP MVCでInstagram APIクライアントを作成していますが、取得要求を出そうとしていますが、例外をスローしたり応答せずに失敗し、私のタイムアウト。ここに私のコードは次のとおりです。ここで私は、私はホームコントローラに私のサービスを呼び出す方法を追加ASP HttpClient GetAsyncが応答していないか、タイムアウトしていません

public class InstagramService 
{ 
    private HttpClient Client = new HttpClient { 
     BaseAddress = new Uri("https://api.instagram.com/v1/"), 
     Timeout = TimeSpan.FromMilliseconds(500) 
    }; 
    public async Task<InstagramUser> GetInstagramUser(long? userId = null) 
    { 
     InstagramUser User = null; 
     string Parameter = (userId == null) ? "self" : userId.ToString(); 
     try { 
      var response = await Client.GetAsync("users/" + Parameter + "/" + GetAccessToken()); 
      if (response.IsSuccessStatusCode) 
      { 
       User = await response.Content.ReadAsAsync<InstagramUser>(); 
      } 
     }catch(Exception e) 
     { 
      Console.WriteLine(e.Message); 
      Console.WriteLine(e.InnerException.Message); 
     } 
     return User; 
    } 

    private string GetAccessToken() 
    { 
     return "?access_token=" + DB.config_det_sys.Single(i => i.codigo == "ACCESS_TOKEN_INSTAGRAM" && i.estado == true).Valor; 
    } 

} 

EDIT

、私はまだテストタスク

public class HomeController : Controller 
{ 
    private InstagramService IGService = new InstagramService(); 
    public ActionResult About() 
    { 
     var apiCall = IGService.GetInstagramUser(); 
     var model = apiCall.Result; 
     return View(model); 
    } 
} 

Iを非同期するようにコントローラを変更しますPostmanがAPI呼び出しを試みる際にテストしました。実際にはうまくいきました。そこで、どこでエラーを見つけられないのですか?

+1

コードはどのように呼び出されていますか?コールスタックの上にブロッキングコールが上がっていないことを確認してください。 – Nkosi

+0

@Nkosiここでは、メソッドをキャリブレーションする方法の断片を追加しました –

+0

Stephen Clearyの答えをチェックしてください。私は 'apiCall.Result'をブロックしてデッドロックを引き起こす可能性があると考えていました。非同期/待機を使用するように変換する – Nkosi

答えて

3

あなたの問題はここにある:

var model = apiCall.Result; 

私は私のブログ、you shouldn't block on asynchronous codeに説明したよう。デッドロックが発生する可能性があります。

代わりのResultawaitを使用します。

スティーブンの答えに追加
var model = await apiCall; 
+0

GETエンドポイントを呼び出すサービスに対して別のプライベート非同期メソッドを作成すると(呼び出しごとにアクセストークンを追加する必要があるため)、3つの非同期呼び出しが影響を与える可能性がありますパフォーマンス? –

+1

@Forcefield:3つの非同期呼び出しでは、パフォーマンスが大幅に変化することはありません。 –

2

asyncすべての方法であることを、コントローラのアクションを更新します。

public class HomeController : Controller { 
    private InstagramService IGService = new InstagramService(); 
    public async Task<ActionResult> About() { 
     var model = await IGService.GetInstagramUser(); 
     return View(model); 
    } 
} 
関連する問題