Singleton httpclient против создания нового запроса httpclientC#

Место общения программистов C#
Ответить
Anonymous
 Singleton httpclient против создания нового запроса httpclient

Сообщение Anonymous »

Я пытаюсь создать слой для веб-службы с помощью HttpClient в моем мобильном приложении Xamarin.Forms.
  • Без одноэлементного шаблона
  • С одноэлементным шаблоном
В подходе first я создаю новый объект HttpClient в каждом новом запросе, сделанном мобильным устройством приложение.
Вот мой код

Код: Выделить всё

public HttpClient GetConnection()
{

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

return httpClient;
}
Код запроса публикации

Код: Выделить всё

public async Task PostAsync(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(responseData, _jsonSerializerSettings));
}
else
{
throw new NullReferenceException("NullReferenceException @ PostAsync  httpclient is null WebRequest.cs");
}
}
Клиент будет использовать следующий код для выполнения запроса

Код: Выделить всё

new LoginService(new WebRequest()).UserLogin(userRequest);
внутри класса, реализующего IWebRequest

Код: Выделить всё

_webRequest.PostAsync(Constants.USER_LOGIN, userRequest);
в втором подходе я повторно использую один и тот же клиентский объект http в каждом новом запросе
здесь мой одноэлементный класс также является потокобезопасным.

Код: Выделить всё

private static readonly Lazy lazy =
new Lazy(() => 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;
}
Код запроса публикации

Код: Выделить всё

public Task 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);
}
Клиент будет использовать следующий код для выполнения

Код: Выделить всё

HttpService.Instance.sendData(...)
Я просмотрел в Интернете множество библиотек, таких как RestSharp, просто чтобы изучить лучшие, и обнаружил, что большинство из них создают новые объекты по запросу. Поэтому я не понимаю, какой шаблон подходит лучше всего.

Подробнее здесь: https://stackoverflow.com/questions/487 ... nt-request
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»