ObjectDisposedException даже после установки обработчика клиента в false, поэтому я не уничтожаю и использую тот же экземпляр - PullRequest
0 голосов
/ 10 октября 2019

Из прочтения других сообщений в stackoverflow я пытаюсь повторно использовать один и тот же httpclient для нескольких методов, но все равно получаю сообщение об ошибке:

System.ObjectDisposedException: Cannot access a disposed object. Object name: 'System.Net.Http.HttpClient'.

public class Program
{
    private readonly static HttpClientHandler handler = new HttpClientHandler();
    private readonly static HttpClient client = new HttpClient(handler, false);

    public Program()
    {
        client.BaseAddress = new Uri();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    }


    public async IDictionary<string, object> GetCustomer(string customerId)
    {
        using (client)
        {
            try
            {
                 var response = await client.GetAsync().ConfigureAwait(false);
                 response.EnsureSuccessStatusCode();
                 var responseContent = await.result.Content.ReadAsStringAsync();
                 return JsonConvert.DeserializeObject<IDictionary<string, object>(responseContent);
            }
            catch { }
        }

    }

    public async IDictionary<string, object> GetOrdersByCustomerId(string customerId)
    {
        using (client)
        {
            try
            {
                 var response = await client.GetAsync().ConfigureAwait(false);
                 response.EnsureSuccessStatusCode();
                 var responseContent = await.result.Content.ReadAsStringAsync();
                 return JsonConvert.DeserializeObject<IDictionary<string, object>(responseContent);
            }
            catch { }
        }

    }
}

Inотдельный файл, я вызываю эти два метода один за другим, как таковые:

var customer = programInstance.GetCustomer().GetAwaiter().GetResult();
var orders = programInstance.GetOrdersByCustomerId().GetAwaiter().GetResult();

Когда я вызываю GetCustomer(), ответ 200 OK, и я могу получить информацию, которую яхочу, но как только я позвоню GetOrdersByCustomerId(), я получу сообщение об ошибке, заявленное ранее.

Я читал о том, нужно ли утилизировать httpclient или как некоторые люди избавились от ошибки, захвативобработчик и установка располагают в false, но это не похоже на то, что это работает для меня.

Есть что-то, что я здесь упускаю?

1 Ответ

0 голосов
/ 10 октября 2019

Вам не хватает того, что оба ваших метода утилизируют ваш HttpClient, что делает его непригодным для использования в последующих вызовах, как и любой удаленный объект (Streams, ...)

Вы либо хотите создать новый HttpClientкаждый раз, если используется внутри using (не рекомендуется в соответствии с документацией , если ожидается высокая нагрузка), или сохраняйте экземпляр до закрытия приложения.

...