2016-12-21 2 views
4

Я создаю клиентский интерфейс Instagram на ASP MVC с использованием HttpClient, я пытаюсь сделать запрос на получение, но он терпит неудачу, не бросая исключение или не реагируя на него мой тайм-аут. Вот мой код: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

Здесь я добавляю, как я называю обслуживание на главном контроллере, я все равно буду тестировать изменения контроллер ASync Task

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

на проверку ответа Стивена Клири. Поскольку я подозревал, что вы делали блокирующий вызов на 'apiCall.Result', который может привести к тупиковой ситуации. Преобразование действия для использования async/await – Nkosi

ответ

3

Ваша проблема здесь:

var model = apiCall.Result; 

Как я описал в моем блоге, you shouldn't block on asynchronous code. Это может вызвать тупик.

Вместо Result используйте await:

var model = await apiCall; 
+0

У меня есть небольшое сомнение. Если я создаю еще один частный асинхронный метод для службы, вызывающей конечные точки GET (потому что мне нужно добавить токен доступа для каждого вызова), вызов трех асинхронных ожидающих может повлиять представление? –

+1

@Forcefield: Три асинхронных вызова не будут иметь заметного изменения производительности вообще. –

2

Добавление к ответу Стефана, обновить действие контроллера, чтобы быть async весь путь.

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