Я работаю над проектом UWP, где информация собирается через веб-сервис на основе REST / JSON с удаленного устройства.Подключение к этому устройству осуществляется через WiFi и работает на встроенном веб-сервере.Он поддерживает неаутентифицированные запросы, которые работают нормально, и дайджест-аутентификацию, которая доставляет мне проблемы.
Начальная проверка соединения выполняется с помощью этого минимального кода:
var credentials = new NetworkCredential(settings.CameraUsername, settings.CameraPassword);
public async Task<bool> VerifyConnection()
{
try
{
string endpoint = string.Format(ccapiEndpoint, settings.CameraIP, settings.CameraPort);
using (HttpClient c = new HttpClient(new HttpClientHandler() { Credentials = credentials }))
{
var r = await c.GetAsync(endpoint);
r.EnsureSuccessStatusCode(); // debugging breakpoint
var response = await r.Content.ReadAsStringAsync();
var data = JsonConvert.DeserializeObject<ApiInfo>(response);
return await UpdateCameraInformationAsync();
}
}
catch (HttpRequestException)
{
return false;
}
}
Тем не менее, соединение вызывает у меня некоторые проблемы, и я не уверен, возникают ли они из-за моего минимального понимания системы дайджеста или из-за неправильного использования API
- Начальное соединение работаетхорошо, если веб-сервер запущен новый.Я вижу в Fiddler, что после начального 401 выполняется запрос с учетными данными, а затем следует 200 .Я выполняю запрос в других методах , где учетные данные не устанавливаются вручную и используется только
HttpClient c = new HttpClient()
.Эти запросы успешны и отправляют соответствующий заголовок дайджеста.Итак, мой вопрос номер один: Как / Где хранится эта дайджест-информация, чтобы новые экземпляры HttpClient «знали», какую информацию отправлять ? - Я загружаю кучу изображений изустройство через привязанные к данным URL.Эти изображения - частично - работают нормально.Я вижу в fiddler, что приложение отправляет соответствующие заголовки.Через некоторое время несколько изображений отправляются с неправильным nc в их дайджест-информации.(Я подозреваю, что проблема синхронизации - причина), которая заставляет изображения (и все запросы после этого) терпеть неудачу с 401. Это поднимает два вопроса:
- a) Каков подходящий способ обработать переподключение в этомдело?Нужно ли отправлять аутентификационную информацию еще раз?
- b) где должно обрабатываться это исключение?Так как это поднято привязкой данных, я не уверен, где это поймать.
AppDomain.UnhandledException
- это то, где отладчик явно ломается, но я думаю, что обработка этого в модели представления могла бы быть более уместной. - c) возможно ли заставить загрузку изображений быть последовательной?Подход, который мне пришел в голову, состоял в том, чтобы написать «кэширующий» сервис, который последовательно загружает изображения, сохраняет их локально и возвращает локальный файл.Этот подход не может быть тривиальным из-за проблем с синхронизацией, я подозреваю ...