【问题标题】:Error downloading image from https urls in c#从 c# 中的 https url 下载图像时出错
【发布时间】:2018-01-24 12:31:59
【问题描述】:

所以,我是一名数据库管理员,出于奇怪的原因,我必须维护 c# 代码,而我对此完全不屑一顾……代码应该从 url 下载图像,但是当 url 是 httpS 时,我有一个错误(简单的 http url 完全没有问题)。我认为我的前任也有同样的问题,因为我可以在代码中看到忽略 https 的演练:

public override Stream GetData(DataManager dm)
{
    try
    {
        // Change SSL checks so that all checks pass
        ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; });
        // download image
        return new MemoryStream(dm.Caller.DownloadData(OriginUrl));
    }
    catch(Exception e)
    {
        throw new Exception(String.Format("Failed to download image at this url '{0}'", OriginUrl), e);
    }
}

我试图阅读一些关于 ServerCertificateValidationCallback 的内容,但这是我第一次阅读 c# 代码,我完全迷失了......你知道为什么这段代码不适用于 httpS url吗? (标准的 http url 完全没有问题)。

非常感谢

【问题讨论】:

  • 不起作用对我们没有帮助,它现在以什么方式起作用?你有错误吗?如果有,它们是什么?
  • 除了 DavidG 已经说过的,我们还需要更多关于代码的细节。看起来实际下载发生在dm.Caller.DownloadData(OriginUrl),但我们不知道该代码是什么样的......这是您正在使用的第三方库还是您自己(即您的前任)代码或其他什么?
  • 嗨,DavidG,的确,很抱歉,它不是很有启发性....代码中捕获的异常“e”收到法语消息“Impossible de lire les données de la connexion de transport : Une connexion existsante一个 dû être fermée par l'hôte 遥远的地方。”我可以近似地翻译为“无法读取连接的数据,现有连接可能已被远程主机关闭”(可能不是准确的翻译)......
  • 嗨,克里斯,关于 DownloadData(),当我要求函数参考时,我转到的文件名为 System.Net.WebClient.cs,它似乎是第三方库,因为我没有'当我看他的定义时没有任何代码,只是public byte[] DownloadData(string address);这行,没有代码
  • 我忘了提一些事情:对于假的 https url(即,当在网络浏览器中我用 http 替换 https 并且 url 仍然访问网站但在非安全连接中),那么我可以下载图像,但如果我让 S 在 https 中,即使是假的 https url,DownloadData 也不起作用)

标签: c# https download


【解决方案1】:
var req = (HttpWebRequest)WebRequest.Create(OriginUrl);
try
{
  using (var resp = (HttpWebResponse)req.GetResponse())
  {
    return resp.GetResponseStream();
  }
}
catch (Exception e)
{
  throw new Exception(String.Format("Failed to download image at this url '{0}'", OriginUrl), e);
}

【讨论】:

  • 这不会在返回流后立即处理HttpWebResponse 吗?如果您处置其父对象,则不确定该流的有效性。我会先亲自将该流读入字节数组。
  • 也就是说,问题中的数据来自一个叫做DataManager的东西,所以不确定这有多大的相关性。
  • 感谢您的尝试,但我仍然收到相同的错误消息
【解决方案2】:

尝试在下方添加code 并将其放在下载图像的行上方:

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

【讨论】:

    猜你喜欢
    • 2015-02-16
    • 2021-10-22
    • 2015-10-01
    • 2018-07-11
    • 2016-05-21
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    相关资源
    最近更新 更多