답변:
아마도 이런 식으로 ...
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 개념입니다.
?.
미리보기 릴리스 중에 연산자의 이름이 원래 널 전파 연산자인지 아니면 널 조건 연산자 인지 확실하지 않습니다 . 그러나 Atlassian resharper는 이러한 시나리오에서 null 전파 연산자를 사용하라는 경고를 표시합니다. null 조건부 연산자라고도합니다.
이것은 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;
}
return 0
? 또는 더 나은 HttpStatusCode?
( nullable )?
var code = GetHttpStatusCode(ex); if (code != HttpStatusCode.InternalServerError) {EventLog.WriteEntry( EventLog.WriteEntry("MyApp", code, System.Diagnostics.EventLogEntryType.Information, 1);}