Попаднах на странно държание на System.Net.Http.HttpClient в .NET 4.5. Когато await-вам резултата на извикването(например на httpClient.GetAsync(...)), нищо не се връща.
Това се случва само при определени обстоятелства- когато ползвам новите функционалности на езика async/await и Tasks API-то. Кодът изглежда работи винаги когато използвам само продължения.
Имам следните GET заявки:
/api/test1
/api/test2
/api/test3
/api/test4
/api/test5 <--- никога не завършва
/api/test6
Всичките връщат едни и същи данни, освен /api/test5, който не връща нищо.
На бъг ли съм попаднал или използвам HttpClient класа неправилно?
Ето малко от кода, който създава проблем
public class BaseApiController : ApiController
{
/// <summary>
/// Получава данни чрез continuations
/// </summary>
protected Task<string> Continuations_GetSomeDataAsync()
{
var httpClient = new HttpClient();
var t = httpClient.GetAsync("http://google.com", HttpCompletionOption.ResponseHeadersRead);
return t.ContinueWith(t1 => t1.Result.Content.Headers.ToString());
}
/// <summary>
/// Взима данни чрез async/await
/// </summary>
protected async Task<string> AsyncAwait_GetSomeDataAsync()
{
var httpClient = new HttpClient();
var result = await httpClient.GetAsync("http://google.com", HttpCompletionOption.ResponseHeadersRead);
return result.Content.Headers.ToString();
}
}
public class Test1Controller : BaseApiController
{
/// <summary>
/// Обработва Task-а с Async/Await
/// </summary>
public async Task<string> Get()
{
var data = await Continuations_GetSomeDataAsync();
return data;
}
}
public class Test2Controller : BaseApiController
{
/// <summary>
///Обработва task-а като блокира нишката докато се изпълни
/// </summary>
public string Get()
{
var task = Continuations_GetSomeDataAsync();
var data = task.GetAwaiter().GetResult();
return data;
}
}
public class Test3Controller : BaseApiController
{
/// <summary>
/// Подава task-а обратно на контролера
/// </summary>
public Task<string> Get()
{
return Continuations_GetSomeDataAsync();
}
}
public class Test4Controller : BaseApiController
{
/// <summary>
/// Обработва task-а с async/await
/// </summary>
public async Task<string> Get()
{
var data = await AsyncAwait_GetSomeDataAsync();
return data;
}
}
public class Test5Controller : BaseApiController
{
/// <summary>
/// Обработва task-а като блокира нишката докато се изпълни
/// </summary>
public string Get()
{
var task = AsyncAwait_GetSomeDataAsync();
var data = task.GetAwaiter().GetResult();
return data;
}
}
public class Test6Controller : BaseApiController
{
/// <summary>
/// Подава task-а обратно на контролера
/// </summary>
public Task<string> Get()
{
return AsyncAwait_GetSomeDataAsync();
}
}