ObjectDisposedException anche dopo aver impostato il programma e gestore falso quindi non mi smaltimento e utilizzando la stessa istanza

voti
0

Dalla lettura di altri messaggi su StackOverflow, sto cercando di riutilizzare la stessa httpclient per più metodi, ma sto ancora ricevendo l'errore:

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 un file separato, sto chiamando questi due metodi uno dopo l'altro come ad esempio:

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

Quando chiamo GetCustomer(), la risposta è 200 OK e io sono in grado di recuperare le informazioni che voglio, ma non appena mi chiamo GetOrdersByCustomerId(), ho quindi ottenere il messaggio di errore indicato in precedenza.

Ho letto circa se httpclient deve essere smaltire o come alcune persone sono sbarazzati dell'errore afferrando il gestore e l'impostazione smaltire a false, ma non sembra che funzioni per me.

C'è qualcosa che mi manca qui?

È pubblicato 10/10/2019 alle 00:46
fonte dall'utente
In altre lingue...                            


1 risposte

voti
0

Vi manca che entrambi i metodi sono smaltire il tuo HttpClientrendendolo inutilizzabile a ulteriori richieste, come qualsiasi oggetto eliminato (Streams, ...)

O si vuole creare un'istanza di una nuova HttpClientogni volta, se usato all'interno using(non una buona idea in base alla documentazione se si prevede alto carico), oppure mantenere l'istanza fino a quando l'applicazione viene chiusa.

Risposto il 10/10/2019 a 00:58
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more