Как я могу поймать 404?

У меня есть следующий код:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "HEAD";
request.Credentials = MyCredentialCache;

try
{
    request.GetResponse();
}
catch
{
}

Как я могу зафиксировать определенные 404 ошибки? WebExceptionStatus. ProtocolError может только обнаружить, что ошибка произошла, но не дают точный код ошибки.

Например:

catch (WebException ex)
{
    if (ex.Status != WebExceptionStatus.ProtocolError)
    {
        throw ex;
    }
}

Просто не достаточно полезно..., исключение протокола могло быть 401, 503, 403, что-либо действительно.

86
задан John Saunders 7 January 2014 в 19:45
поделиться

7 ответов

Используйте HttpStatusCode перечисление, а именно HttpStatusCode.NotFound

Что-то вроде:

HttpWebResponse errorResponse = we.Response as HttpWebResponse;
if (errorResponse.StatusCode == HttpStatusCode.NotFound) {
  //
}

Где
мы является WebException.

.
107
ответ дан 24 November 2019 в 07:56
поделиться

Зацените этот фрагмент. GetResponse бросит WebRequestException. Поймайте это и вы сможете получить код статуса из ответа.

try {
   // Create a web request for an invalid site. Substitute the "invalid site" strong in the Create call with a invalid name.
     HttpWebRequest myHttpWebRequest = (HttpWebRequest) WebRequest.Create("invalid site");

    // Get the associated response for the above request.
     HttpWebResponse myHttpWebResponse = (HttpWebResponse) myHttpWebRequest.GetResponse();
    myHttpWebResponse.Close();
}
catch(WebException e) {
    Console.WriteLine("This program is expected to throw WebException on successful run."+
                        "\n\nException Message :" + e.Message);
    if(e.Status == WebExceptionStatus.ProtocolError) {
        Console.WriteLine("Status Code : {0}", ((HttpWebResponse)e.Response).StatusCode);
        Console.WriteLine("Status Description : {0}", ((HttpWebResponse)e.Response).StatusDescription);
    }
}
catch(Exception e) {
    Console.WriteLine(e.Message);
}

это пришло с http://msdn.microsoft.com/en-us/library/system.net.webexception.status.aspx

2
ответ дан 24 November 2019 в 07:56
поделиться

Я думаю, что если вы поймаете WebException, то там есть некоторая информация, которую вы можете использовать, чтобы определить, был ли это 404. Это единственный известный мне на данный момент способ... Мне было бы интересно узнать другие...

catch(WebException e) {
    if(e.Status == WebExceptionStatus.ProtocolError) {
        var statusCode = (HttpWebResponse)e.Response).StatusCode);
        var description = (HttpWebResponse)e.Response).StatusDescription);
    }
}
4
ответ дан 24 November 2019 в 07:56
поделиться

см. В MSDN ​​о состоянии ответа:

...
catch(WebException e) {
  Console.WriteLine("The following error occured : {0}",e.Status);  
}
...
2
ответ дан 24 November 2019 в 07:56
поделиться

Поймай правильный тип исключения WebException :

try
{
    var request = (HttpWebRequest) WebRequest.Create(String.Format("http://www.gravatar.com/avatar/{0}?d=404", hashe));

    using(var response = (HttpWebResponse)request.GetResponse())
        Response.Write("has avatar");
}
catch(WebException e) 
{
  if(e.Response.StatusCode == 404) 
    Response.Write("No avatar");
}
2
ответ дан 24 November 2019 в 07:56
поделиться
try
{
    var request = WebRequest.Create(uri);
    using (var response = request.GetResponse())
    {
        using (var responseStream = response.GetResponseStream())
        {
            // Process the stream
        }
    }
}
catch (WebException ex)
{
    if (ex.Status == WebExceptionStatus.ProtocolError &&
        ex.Response != null)
    {
        var resp = (HttpWebResponse) ex.Response;
        if (resp.StatusCode == HttpStatusCode.NotFound)
        {
            // Do something
        }
        else
        {
            // Do something else
        }
    }
    else
    {
        // Do something else
    }
}
122
ответ дан 24 November 2019 в 07:56
поделиться

Я не тестировал это, но оно должно работать

try
{
    // TODO: Make request.
}
catch (WebException ex)
{
    if (ex.Status == WebExceptionStatus.ProtocolError) {
        HttpWebResponse resp = ex.Response as HttpWebResponse;
        if (resp != null && resp.StatusCode == HttpStatusCode.NotFound)
        {
            // TODO: Handle 404 error.
        }
        else
            throw;
    }
    else
        throw;
}
13
ответ дан 24 November 2019 в 07:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: