Singleton httpclient vs la création de nouveaux httpclient demande

Je suis en train de créer une couche de service web à l'aide de HttpClient dans mon Xamarin.Forms application mobile.

  1. sans singlton modèle
  2. avec le pattern singleton

dans première approche, je suis la création de nouveaux client http objet dans chaque nouvelle demande
par application mobile.

voici mon code

  public HttpClient GetConnection()
        {

            HttpClient httpClient = new HttpClient();
            httpClient.BaseAddress = new Uri(baseAddress); 
            httpClient.Timeout = System.TimeSpan.FromMilliseconds(timeout);


            return httpClient;

        }

post de demande de code

 public async Task<TResult> PostAsync<TRequest, TResult>(String url, TRequest requestData)
        {
            HttpClient client = GetConnection();
            String responseData = null;
            if (client != null)
            {

                String serializedObject = await Task.Run(() => JsonConvert.SerializeObject(requestData, _jsonSerializerSettings));
                var jsonContent = new StringContent(serializedObject, System.Text.Encoding.UTF8, "application/json");
                HttpResponseMessage response = await client.PostAsync(new Uri(url, UriKind.Relative), jsonContent);
                responseData = await HandleResponse(response);


                return await Task.Run(() => JsonConvert.DeserializeObject<TResult>(responseData, _jsonSerializerSettings));


            }
            else
            {

                throw new NullReferenceException("NullReferenceException @ PostAsync  httpclient is null WebRequest.cs");

            }

        }

client utilise le code suivant pour l'exécution de la demande

new LoginService(new WebRequest()).UserLogin(userRequest);

à l'intérieur de la classe qui implémente IWebRequest

_webRequest.PostAsync<UserRequest,bool>(Constants.USER_LOGIN, userRequest);

dans deuxième approche, je suis en réutilisant les mêmes http objet client à chaque nouvelle demande
ici , ma classe singleton est thread-safe trop.

private static readonly Lazy<HttpService> lazy =
        new Lazy<HttpService>(() => new HttpService());

        public static HttpService Instance { get { return lazy.Value; } }



        private HttpClient getConnection()
        {

            client = new HttpClient();
            client.Timeout = System.TimeSpan.FromMilliseconds(timeout);

            //client.MaxResponseContentBufferSize = 500000;
            client.BaseAddress = new Uri(baseAddress);
            return client;
        }

post de demande de code

public Task<HttpResponseMessage> sendData(String url,String jsonData)
        {

            var jsonContent = new StringContent(jsonData, System.Text.Encoding.UTF8, "application/json");

            return getConnection().PostAsync(new Uri(url, UriKind.Relative), jsonContent);
        }

client utilise le code suivant pour exécuter

HttpService.Instance.sendData(...)

je suis passé par de nombreuses bibliothèques comme RestSharp sur le web juste pour explorer le meilleur et j'ai trouvé que la plupart d'entre eux sont en train de créer de nouveaux objets par demande. donc, je ne sais pas quel modèle vous convient le mieux.

  • Ne crée pas de HttpClient, et pourquoi.
  • HttpClient implémente IDisposable, qui doivent être satisfaites (sauf si vous utilisez une instance statique de celui-ci)
InformationsquelleAutor Hunt | 2018-02-14