2016-02-05 2 views
4

У меня есть функционирующий Task асинхронного, который вызывает веб-службу:Проблемы создания HttpClient вспомогательного метод

private async Task GetResult() 
{ 
    using (var client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri(_baseAddress); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(
     new MediaTypeWithQualityHeaderValue("application/json")); 
     client.DefaultRequestHeaders.Add("Username", _username); 
     client.DefaultRequestHeaders.Add("Action", "GET"); 
     /* etc */ 
     var response = await client.GetAsync(client.BaseAddress); 
    } 
} 

Я хотел бы выделить создание объекта HttpClient, поэтому он может быть параметризованным и повторно:

private async Task GetResult() 
{ 
    using (var client = GetClient(_baseAddress, _username)) 
    { 
     var response = await client.GetAsync(client.BaseAddress); 
    } 
} 
private static HttpClient GetClient(string Address, string Username) 
{ 
    using (var client = new HttpClient()) 
    { 
     client.BaseAddress = new Uri(Address); 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(
     new MediaTypeWithQualityHeaderValue("application/json")); 
     client.DefaultRequestHeaders.Add("Username", Username); 
     client.DefaultRequestHeaders.Add("Action", "GET"); 
     /* etc */ 
     return client; 
    } 
} 

в то время как это, кажется, функционально идентичен мне, последний выдает ошибку AggregateException с внутренним исключением

Не удается получить доступ к расположенному объекту. Имя объекта: «System.Net.Http.HttpClient».

Возможно, есть какая-то асинхронная тонкость, которую я не понимаю?

+0

Я обновил название, чтобы прояснить проблему - не стесняйтесь отката. –

+0

Выглядит хорошо. Я не мог придумать правильную формулировку. – Matt

ответ

7

Избавьтесь от using внутри GetClient. Вы используете только using для вещей, которые остаются «в вашей собственности», вы «отказываетесь от права собственности вызывающему», когда вы return client;.

Теперь вы можете использовать оператор using (который вы делаете уже правильно в GetResult).

Это не имеет никакого отношения к asnyc и является просто стандартным поведением IDisposable.

+0

Так просто, иди! – Matt

Смежные вопросы