首页 > 解决方案 > Weather.com api:可以排除无法加载图像的网络摄像头吗?

问题描述

我有一个 C# MVC 网站,它在后端调用 weather.com api,将数据(作为 JSON -> C# POCO)作为模型传递到前端,并在视图中处理我需要的内容。

可以让 weather.com API 返回本地网络摄像头列表。在每个网络摄像头类对象中,都有一个名为的属性Currentimageurl,令人惊讶的是,它包含一个网络摄像头图像的 url。

我注意到其中一些没有出现。非常具体地说,当您尝试直接导航到这些时,您会收到类似于以下内容的拒绝访问错误:

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

所有其他图像均按您的预期显示。而且,非常具体地说,当您尝试加载它们或导航到它们时,相同的图像会反复给出拒绝访问错误。

问题是:

  1. 为什么我会收到拒绝访问错误,我该怎么办?

或者

  1. 有没有办法确定哪些图像给了我访问被拒绝的消息并从前端渲染中省略它们?如果它很重要,后端是 C#,前端是 RAZOR 和 javascript/jquery。这些被嵌入到引导轮播中(在 a 中生成指示符和图像foreach webcam),因此指示符和图像必须与对拒绝访问的图像进行正确的“滑动到”调整保持同步。

标签: c#jqueryasp.net-mvc-4razorweather-api

解决方案


虽然它不是最快的解决方案,但它具有工作的优点,并且只需要大约 6 秒即可解析 45 个网络摄像头 URL。我确信它可以被优化,但这里是最初的解决方案:

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 的集合。


推荐阅读