WebClient returns 500(内部服务器错误)在下载文件中,而浏览器确实加载了图像

WebClient returns 500 (Internal Server Error) in DownloadFile while browsers do load the image

我想使用 WebClient 从网站下载图像。 我用浏览器检查了图片是否存在,确实存在。

我正在使用此代码下载图像:

Private Function pDownload(ByVal uFrom As String, ByVal uTo As String) As Boolean

    Try
        Using Client As New WebClient
            Client.DownloadFile(uFrom, uTo)
        End Using
        Return True
    Catch ex As Exception
        Debug.Print("Failed: " + uFrom + vbNewLine + ex.ToString)
        Return False
    End Try

End Function

有人知道为什么它可能 return 500 - 内部服务器错误吗?

500 - 内部服务器错误是服务器响应,而不是 .net 中的本地错误。您的下载代码是一个非常简单的调用,用于将 URL uFrom 下载到本地文件 uTo-- 听起来它工作正常。

问题是服务器正在响应 500 INTERNAL SERVER ERROR,而您希望它响应 200 OKWebClient 看到来自服务器的 500 响应并且知道它是一个 non-successful 响应所以它抛出该异常。如果文件丢失,服务器 应该 响应 404 NOT FOUND。如果是没有权限的问题,我们希望 well-behaved 服务器响应 401 NOT AUTHORIZED。通用 500 响应仅表示 "something unexpected went wrong".

服务器响应 500-- 的原因有很多,例如文件系统错误、数据库错误、服务器应用程序中的错误等。我假设您不是发布任何 server-side 代码,说明您没有编写服务器应用程序并且这是一个现有的(并且可能是 well-behaved)服务器。由于您没有做任何花哨的事情——只是试图下载一个文件——那么我能想到的最可能的原因可能是 uFrom 中的 url 无效,或者被认为不安全服务器。

测试 url 它以 incognito/private 浏览模式打开新浏览器 window 的简单方法(以确保您没有导致服务器行为不同的 cookie ) 并将 uFrom 的值直接粘贴到地址栏中。如果您在浏览器中得到相同的结果 (500),那么您就知道服务器或您的 URL 有问题。如果您在浏览器测试中得到的结果与从 运行 代码中得到的结果不同,那么来自浏览器的请求 headers 与默认情况下 WebClient 发送的请求有所不同。如果是这种情况,我建议安装 fiddler 或类似工具来检查浏览器请求 url 与代码请求相同 url 时发生的差异。

有时服务器会因为用户代理不存在而拒绝请求。

您可以使用以下代码行添加它。

Client.Headers.Add ("user-agent", "Your User-Agent")

完整示例和文档:https://docs.microsoft.com/en-us/dotnet/api/system.net.webclient?view=netframework-4.7