HttpWebRequest.GetResponse 方法抛出 404 异常

Kal*_*ela 5 c# asp.net web-applications

我想使用控制台应用程序从 url 下载一张图像。

我使用了以下代码:

string sourceUrl = "http://i.ytimg.com/vi/pvBnYBsUi9A/default.jpg"; // Not Found
                //string sourceUrl = "http://i.ytimg.com/vi/OrxZAN1FZUY/default.jpg"; // Found
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(sourceUrl);
                HttpWebResponse response = null;
                try
                {
                    response = (HttpWebResponse)request.GetResponse();
                }
                catch (Exception)
                {

                }
Run Code Online (Sandbox Code Playgroud)

上面的代码在“response = (HttpWebResponse)request.GetResponse();”行抛出异常

但是当我在浏览器中访问“ http://i.ytimg.com/vi/pvBnYBsUi9A/default.jpg ” url 时,将显示图像。

我在这里缺少什么?

jos*_*shp 2

我在 Chrome 开发者工具中尝试了该网址“ http://i.ytimg.com/vi/pvBnYBsUi9A/default.jpg ”。它还收到 404,但响应包含显示的图像。

您的代码不是异常的原因。该网站返回 404,并且您的代码出现异常。

即使收到 404 错误,您也可以编写逻辑来查看响应并决定是否接受它,就像浏览器所做的那样。

如果捕获 WebException,您似乎可以获得站点返回的响应,这允许您根据文档查看 http 请求状态和响应。

.Net 4.5 文档中的示例...

try 
      { 
            // Creates an HttpWebRequest for the specified URL. 
            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
            // Sends the HttpWebRequest and waits for a response.
            HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); 
            if (myHttpWebResponse.StatusCode == HttpStatusCode.OK)
               Console.WriteLine("\r\nResponse Status Code is OK and StatusDescription is: {0}",
                                    myHttpWebResponse.StatusDescription);
            // Releases the resources of the response.
            myHttpWebResponse.Close(); 

        } 
    catch(WebException e) 
       {
            Console.WriteLine("\r\nWebException Raised. The following error occured : {0}",e.Status); 
       }
    catch(Exception e)
    {
        Console.WriteLine("\nThe following Exception was raised : {0}",e.Message);
Run Code Online (Sandbox Code Playgroud)

WebException 具有 Response 和 Status 属性。所以看起来.Net处理这个问题的方法是捕获WebException并根据状态和响应内容确定如何处理(如果需要)。