Weather.com api: 可以排除无法加载图像的网络摄像头吗?
Weather.com api: Possible to exclude webcam where images cannot load?
我有一个 C# MVC 网站,它在后端调用 weather.com api,将数据(作为 JSON -> C# POCO)作为模型,并在视图中处理我需要的内容。
可以让 weather.com API return 本地网络摄像头列表。在每个网络摄像头 class 对象中,有一个名为 Currentimageurl
的 属性,令人惊讶的是,其中包含一个用于网络摄像头图像的 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。这些被嵌入到 bootstrap 旋转木马中(指标和图像在
foreach webcam
中生成)因此指标和图像必须与正确的 "slide to" 图像调整保持一致访问。
虽然它不是最快的解决方案,但它具有工作的优点,并且只需要大约 6 秒来解析 45 个网络摄像头 urls。我确定它可以优化,但这是初始解决方案:
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 的集合。
我有一个 C# MVC 网站,它在后端调用 weather.com api,将数据(作为 JSON -> C# POCO)作为模型,并在视图中处理我需要的内容。
可以让 weather.com API return 本地网络摄像头列表。在每个网络摄像头 class 对象中,有一个名为 Currentimageurl
的 属性,令人惊讶的是,其中包含一个用于网络摄像头图像的 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。这些被嵌入到 bootstrap 旋转木马中(指标和图像在
foreach webcam
中生成)因此指标和图像必须与正确的 "slide to" 图像调整保持一致访问。
虽然它不是最快的解决方案,但它具有工作的优点,并且只需要大约 6 秒来解析 45 个网络摄像头 urls。我确定它可以优化,但这是初始解决方案:
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 的集合。