API-интерфейс Weather.com. Можно ли исключить веб-камеру, на которой изображения не загружаются? - PullRequest
0 голосов
/ 26 мая 2018

У меня есть веб-сайт C # MVC, который вызывает API-интерфейс weather.com на сервере, передает данные (как JSON -> C # POCO) во внешний интерфейс в качестве модели и обрабатывает то, что мне нужно в представлении.

API Weather.com может вернуть список локальных веб-камер.В каждом объекте класса веб-камеры есть свойство с именем Currentimageurl, которое, как ни удивительно, содержит URL-адрес изображения веб-камеры.

Я заметил, что некоторые из них не появляются.В частности, когда вы пытаетесь перейти к ним напрямую, вы получаете ошибку отказа в доступе, подобную следующей:

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId><...some number here></RequestId>
    <HostId>
        <...long string of characters here>
    </HostId>
</Error>

Все остальные изображения отображаются так, как вы ожидаете.И, в частности, одни и те же изображения постоянно выдают ошибку отказа в доступе, когда вы пытаетесь загрузить их или перейти к ним.

Вопрос либо:

  1. Почему я получаюошибка доступа запрещена и что я могу с этим сделать?

ИЛИ

Есть ли способ определить, какие изображения дают мне сообщение об отказе в доступе, и исключить их из интерфейса рендеринга?В случае, если это важно, C # на бэкэнде, RAZOR и javascript / jquery на фронте.Они встраиваются в загрузочную карусель (с индикаторами и изображениями, сгенерированными в foreach webcam), поэтому индикаторы и изображения должны храниться в одном месте с правильными настройками «скольжения», сделанными для изображений, которые запрещают доступ.

1 Ответ

0 голосов
/ 26 мая 2018

Хотя это не самое быстрое решение, оно работает благодаря тому, что для анализа 45 URL-адресов веб-камер требуется всего около 6 секунд.Я уверен, что это можно оптимизировать, но вот первоначальное решение:

public void ValidateWebCams() {
    if (Webcams == null || Webcams.Length == 0) {
            throw new System.Exception("Webcams not populated!");
    }
    List<Webcam> newWebCamList = new List<Webcam>();
    foreach (Webcam cam in this.Webcams) {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(cam.Currentimageurl);
        try {
            HttpWebResponse response = (HttpWebResponse)(request.GetResponse());
            newWebCamList.Add(cam);
        }
        catch (WebException ex) {
            var response = (HttpWebResponse)ex.Response; //in case I want to examine this
        }//end catch                  
    }//end foreach
    this.Webcams = new Webcam[newWebCamList.Count];
    int loopCounter = 0;
    foreach (Webcam cam in newWebCamList) {
        this.Webcams[loopCounter++] = cam;
    }
}

Подводя итог, мы перебираем каждую веб-камеру в массиве, получаем URL-адрес и просто нажимаем на него, ища ответ отЭто.Если это 403 (доступ запрещен), он бросает и попадает в улов.Если это бросает, мы действительно не заботимся об этом.Если нет, то мы добавим его в новый список веб-камер.После того, как мы выполним итерацию всей коллекции, мы стерем существующую коллекцию веб-камер и заменим ее на те, которые не имели 403.

...