У меня есть интерфейс для общего использования REST Api.
public interface IRestService
{
Task<TResult> PostAsync<TRequest, TResult, THandlerArgs>(string uri, TRequest data, EventHandler<HttpResponseMessage> resultHandler, string token = "");
}
На практике мне трудно понять, как обрабатывать определенные исключения и регулярный поток таким образом. Моя реализация выглядит так:
public async Task<TResult> PostAsync<TRequest, TResult, THandlerArgs>(string uri, TRequest data, EventHandler<HttpResponseMessage> resultHandler, string token = "")
{
string serialized = await Task.Run(() => JsonConvert.SerializeObject(data))
.ConfigureAwait(false);
HttpResponseMessage response = await _httpClient.PostAsync(uri, new StringContent(serialized, Encoding.UTF8, "application/json"))
.ConfigureAwait(false);
string responseData = await response.Content.ReadAsStringAsync()
.ConfigureAwait(false);
return await Task.Run(() => JsonConvert.DeserializeObject<TResult>(responseData));
}
Я могу вернуть свой десериализованный ответ для моего вызывающего класса. Но как я могу обработать, скажем, код несанкционированного статуса во время входа в систему? Я мог бы выбросить исключение и поймать его в вызывающей стороне, но что, если имя пользователя просто не является реальным логином? Это не исключение, а обычное явление во всех приложениях. Но я не вижу, как я могу определить это по ответным данным, которые я возвращаю.
Я рассмотрел вопрос об изменении типа возврата метода на HttpResponseMessage и проверке кода состояния из вызывающего класса. Что-то не так с этим?
Я также рассмотрел возможность передачи пользовательских обработчиков из вызывающего объекта (см. THandlerArgs выше), но мне это кажется немного излишним.
Что такое неуниверсальный способ обработки общих исключений или стандартных потоков, подобных этому?