Для длинных запросов на опрос вы должны создать отдельный
аюсь создать слой для веб-сервиса, используя HttpClient в моемXamarin.Forms
мобильное приложение.
впервый Подход Я создаю новый объект http-клиента в каждом новом запросе, сделанном мобильным приложением.
вот мой код
public HttpClient GetConnection()
{
HttpClient httpClient = new HttpClient();
httpClient.BaseAddress = new Uri(baseAddress);
httpClient.Timeout = System.TimeSpan.FromMilliseconds(timeout);
return httpClient;
}
почтовый код запроса
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");
}
}
клиент будет использовать следующий код для выполнения запроса
new LoginService(new WebRequest()).UserLogin(userRequest);
внутри класса, который реализуетIWebRequest
_webRequest.PostAsync<UserRequest,bool>(Constants.USER_LOGIN, userRequest);
ввторой Подход Я использую один и тот же объект http-клиента в каждом новом запросе, мой синглтон-класс также является потокобезопасным.
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;
}
почтовый код запроса
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);
}
клиент будет использовать следующий код для выполнения
HttpService.Instance.sendData(...)
я прошел через много библиотек, какRestSharp
через Интернет, чтобы изучить лучшие, и я обнаружил, что большинство из них создают новые объекты по запросу. поэтому я запутался, какой шаблон подходит лучше всего.