У меня есть общий класс для использования в сети операции CRUD.
public class RequestService:IRequest
{
public HttpClient GetClient()
{
string USERNAME = "XXXXXX";
string PASSWORD = "XXXXX";
string BASE_ADDRESS = "https://something.net/api/sync/";
var authValue = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.UTF8.GetBytes($"{USERNAME}:{PASSWORD}")));
var client = new HttpClient
{
BaseAddress = new Uri(BASE_ADDRESS),
DefaultRequestHeaders = { Authorization = authValue }
};
return client;
}
public async Task<TResult> GetAsync<TResult>(HttpClient client, string url)
{
client.Timeout = TimeSpan.FromSeconds(30);
var response = await client.GetAsync(url);
response.EnsureSuccessStatusCode();
var jsonString = await response.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject<TResult>(jsonString);
return result;
}
public async Task<string> GetStringAsync(HttpClient client, string url)
{
var httpRequest = new HttpRequestMessage(new HttpMethod("GET"), url);
var response = client.SendAsync(httpRequest).Result;
var jsonString = await response.Content.ReadAsStringAsync();
return jsonString;
}
public async Task<TResult> PostAsync<TRequest, TResult>(HttpClient client, TRequest t,string url)
{
var json = JsonConvert.SerializeObject(t);
HttpContent httpContent = new StringContent(json);
httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var response = await client.PostAsync(url, httpContent);
response.EnsureSuccessStatusCode();
var jsonString = await response.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject<TResult>(jsonString);
return result;
}
}
И у меня есть собственный класс, из которого вызываются сетевые службы.
public class DeviceService:IDevice
{
private IRequest RequestService;
public DeviceService(IRequest request)
{
RequestService = request;
}
public async Task<int> GetDeviceID()
{
var client = RequestService.GetClient();
var id = await RequestService.PostAsync<Object, int>(client, null, "Registerdevice");
return id;
}
}
А во ViewModel:
DeviceService.GetDeviceID();
Так что все работает нормально, когда у меня стабильный интернет или успешный ответ с сервера. Теперь я хочу добавить в код возможность обработки ошибок, в том числе: отсутствие подключения к Интернету, другие сетевые исключения и обработку ошибок API, чтобы я мог информировать пользователей об ошибках. Я не уверен, как это сделать. Я попытался использовать блок try-catch внутри класса RequestService, прочитал каждое исключение и выдал его, тогда это означало бы, что мне нужно добавить блок try-catch в классе DeviceService и ViewModel. Или нужно? Я не уверен.