[C#] System.Net.WebException HTTP 상태 코드

에서 HTTP 상태 코드를 얻는 쉬운 방법이 System.Net.WebException있습니까?



답변

아마도 이런 식으로 …

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
    }
}


답변

사용하여 널 조건 연산자를 ( ?.) 당신은 단 한 줄의 코드로 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 개념입니다.


답변

이것은 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;
}


답변

(질문이 오래되었다는 것을 알고 있지만 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 절에 예외를 다시 던질 필요가 없다는 점에 주목하십시오. 위의 솔루션으로 처음에 절을 입력하지 않기 때문입니다.


답변

이 코드를 사용하여 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;
}


답변

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

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


답변