C# Weather.com api:是否可以排除无法加载图像的网络摄像头?

C# Weather.com api:是否可以排除无法加载图像的网络摄像头?,c#,jquery,asp.net-mvc-4,razor,weather-api,C#,Jquery,Asp.net Mvc 4,Razor,Weather Api,我有一个C#MVC网站,它在后端调用weather.com api,将数据(作为JSON->C#POCO)作为模型传递到前端,并在视图中处理我需要的内容 可以让weather.com API返回本地网络摄像头列表。在每个webcam类对象中,都有一个名为Currentimageurl的属性,其中意外地包含一个webcam图像的url 我注意到其中有一些没有出现。非常具体地说,当您尝试直接导航到这些对象时,会出现如下类似的拒绝访问错误: <Error> <Code>

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

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

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

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId><...some number here></RequestId>
    <HostId>
        <...long string of characters here>
    </HostId>
</Error>
所有其他图像都如您所期望的那样显示。而且,非常具体地说,当您尝试加载或导航到这些图像时,这些图像会反复出现拒绝访问错误

问题是:

  • 为什么我会遇到访问被拒绝的错误,我能做些什么
  • 有没有办法确定哪些图像向我发出拒绝访问消息,并从前端渲染中忽略它们?如果这很重要,后端是C#,前端是RAZOR和javascript/jquery。这些都被嵌入到引导转盘中(在
    foreach网络摄像头中生成指示器和图像
    ),因此,指示器和图像必须与针对拒绝访问的图像进行的正确“滑动到”调整保持同步

  • 虽然这不是最快的解决方案,但它的优点是可以工作,并且只需要6秒钟就可以解析45个WebCamURL。我相信可以对其进行优化,但以下是初始解决方案:

    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;
        }
    }
    
    public void ValidateWebCams(){
    如果(网络摄像头==null | |网络摄像头.长度==0){
    抛出新的System.Exception(“未填充网络摄像头!”);
    }
    List newWebCamList=新列表();
    foreach(本网站中的网络摄像头){
    HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(cam.Currentimageurl);
    试一试{
    HttpWebResponse=(HttpWebResponse)(request.GetResponse());
    添加(cam);
    }
    捕获(WebException ex){
    var response=(HttpWebResponse)ex.response;//如果我想检查这个
    }//端接
    }//端部foreach
    this.Webcam=newwebcam[newWebCamList.Count];
    int循环计数器=0;
    foreach(新网络摄像机列表中的网络摄像机){
    这个.Webcams[loopCounter++]=cam;
    }
    }
    
    总之,我们在阵列中循环浏览每个网络摄像头,抓取url并点击它,从中寻找web响应。如果是403(拒绝访问),则抛出并命中捕获。如果它抛出,我们真的不在乎它。如果没有,我们将其添加到新的网络摄像机列表中。一旦我们迭代了整个集合,我们就会擦除现有的网络摄像头集合,并将其替换为没有403的集合