System.Net.WebException HTTP 상태 코드


답변:


248

아마도 이런 식으로 ...

try
{
    // ...
}
catch (WebException ex)
{
    if (ex.Status == WebExceptionStatus.ProtocolError)
    {
        var response = ex.Response as HttpWebResponse;
        if (response != null)
        {
            Console.WriteLine("HTTP Status Code: " + (int)response.StatusCode);
        }
        else
        {
            // no http status code available
        }
    }
    else
    {
        // no http status code available
    }
}

그러나 webexception의 "connectfailure"예외의 경우 응답이 null로 표시됩니다.이 경우 httpstatus 코드를 얻는 방법
Rusty

8
@rusty : 당신은 할 수 없습니다. 연결이 실패하면 가져올 HTTP 상태 코드가 없습니다.
LukeH

4
오류가 ProtocolError 인 경우 응답을 null로 확인할 필요가 없습니다. 이 MSDN 페이지
Andras Toth

5
@AndrasToth 그러나 ReSharper와 같은 도구는 null 검사를 생략하면 경고를 표시합니다. 어쨌든 방어 적으로 코딩하는 것이 좋습니다.
톰 린트

1
HTTP 하위 상태 값은 어떻게 얻 습니까? 예를 들어 404.13 내용 길이가 너무 큼 참조 : docs.microsoft.com/en-us/iis/configuration/system.webServer/…
Kiquenet

27

사용하여 널 조건 연산자를 ( ?.) 당신은 단 한 줄의 코드로 HTTP 상태 코드를 얻을 수 있습니다 :

 HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;

변수 status는를 포함합니다 HttpStatusCode. HTTP 상태 코드가 전송되지 않는 네트워크 오류와 같은보다 일반적인 오류가 발생 status하면 null이됩니다. 이 경우을 ex.Status얻을 수 있는지 검사 할 수 있습니다 WebExceptionStatus.

오류가 발생했을 때 설명 문자열 만 기록하려면 null-coalescing 연산자 ( ??)를 사용하여 관련 오류를 얻을 수 있습니다.

string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString()
    ?? ex.Status.ToString();

404 HTTP 상태 코드의 결과로 예외가 발생하면 문자열에 "NotFound"가 포함됩니다. 반면에 서버가 오프라인 상태이면 문자열에 "ConnectFailure"등이 포함됩니다.

HTTP 하위 상태 코드를 얻는 방법을 알고 싶은 사람은 불가능합니다. 서버에만 로그온되어 클라이언트로 전송되지 않는 Microsoft IIS 개념입니다.


?.미리보기 릴리스 중에 연산자의 이름이 원래 널 전파 연산자인지 아니면 널 조건 연산자 인지 확실하지 않습니다 . 그러나 Atlassian resharper는 이러한 시나리오에서 null 전파 연산자를 사용하라는 경고를 표시합니다. null 조건부 연산자라고도합니다.
RBT

1
이 파티에 조금 늦었지만 null 조건부 연산자가 C # 6.0 기능이므로 공정하게 경고하므로이를 지원하는 컴파일러를 사용해야합니다. 자세한 내용은 스택 오버플로 답변을 참조하십시오 . VS 2015+에는 기본적으로 설정되어 있지만 "그들의 머신"이외의 다른 빌드 / 배포 환경을 사용하는 경우 다른 사항도 고려해야합니다.
CodeHxr

9

이것은 WebResponse가 HttpWebResponse 인 경우에만 작동합니다.

try
{
    ...
}
catch (System.Net.WebException exc)
{
    var webResponse = exc.Response as System.Net.HttpWebResponse;
    if (webResponse != null && 
        webResponse.StatusCode == System.Net.HttpStatusCode.Unauthorized)
    {
        MessageBox.Show("401");
    }
    else
        throw;
}

가능한 모든 HTTP 오류 상태 코드 대신 401-Unauthorized 만 처리하는 이유는 무엇입니까? 이것은 최악의 답변입니다
ympostor

4
@ympostor 이것은 단지 예일뿐입니다. 합리적인 개발자라면 이것을 이해합니다. 당신의 의견은 내가 여기서 읽은 것 중 가장 생각없는 것입니다.
pr0gg3r

9

(질문이 오래되었다는 것을 알고 있지만 Google의 인기 히트작 중 하나입니다.)

응답 코드를 알고 싶은 일반적인 상황은 예외 처리입니다. C # 7부터 예외가 술어와 일치하는 경우 패턴 일치를 사용하여 실제로 catch 절을 입력 할 수 있습니다.

catch (WebException ex) when (ex.Response is HttpWebResponse response)
{
     doSomething(response.StatusCode)
}

이것은 WebException실제로 다른 예외의 내부 예외였던 (이 경우에만 관심이있는 404) 경우와 같이 추가 수준으로 쉽게 확장 될 수 있습니다 .

catch (StorageException ex) when (ex.InnerException is WebException wex && wex.Response is HttpWebResponse r && r.StatusCode == HttpStatusCode.NotFound)

마지막으로, 조건에 맞지 않을 때 catch 절에 예외를 다시 던질 필요가 없다는 점에 주목하십시오. 위의 솔루션으로 처음에 절을 입력하지 않기 때문입니다.


4

이 코드를 사용하여 WebException에서 HTTP 상태 코드를 가져올 수 있습니다. SL에 WebExceptionStatus.ProtocolError가 정의되어 있지 않기 때문에 Silverlight에서도 작동합니다.

HttpStatusCode GetHttpStatusCode(WebException we)
{
    if (we.Response is HttpWebResponse)
    {
        HttpWebResponse response = (HttpWebResponse)we.Response;
        return response.StatusCode;
    }
    return null;
}

1
return 0? 또는 더 나은 HttpStatusCode?( nullable )?
Kiquenet

이것이 효과가 있습니까? var code = GetHttpStatusCode(ex); if (code != HttpStatusCode.InternalServerError) {EventLog.WriteEntry( EventLog.WriteEntry("MyApp", code, System.Diagnostics.EventLogEntryType.Information, 1);}
FMFF

이 샘플에서 원하는 것을 이해할 수 없습니다. 어떤 경우에 이벤트가 기록되기를 원했습니까?
Sergey

1

나는 그것이 있는지 확실하지 않지만 그러한 속성이 있다면 그것은 믿을만한 것으로 간주되지 않을 것입니다. WebException간단한 네트워킹 오류를 포함하여 HTTP 오류 코드 이외의 이유로 A를 실행할 수 있습니다. 그것들은 일치하는 http 오류 코드가 없습니다.

해당 코드로 수행하려는 작업에 대한 정보를 조금 더 제공해 주시겠습니까? 필요한 정보를 얻는 더 좋은 방법이있을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.