ensureSuccessStatusCode 사용 및 발생하는 HttpRequestException 처리
의 사용 패턴은 HttpResponseMessage.EnsureSuccessStatusCode()
무엇입니까? 그것은 메시지의 내용을 폐기하고 던진다 HttpRequestException
. 그러나 나는 그것을 제네릭과 다르게 프로그래밍 방식으로 처리하는 방법을 보지 못한다 Exception
. 예를 들어, 그것은 HttpStatusCode
편리했을 것입니다.
더 많은 정보를 얻을 수있는 방법이 있습니까? 누구든지 EnsureSuccessStatusCode()
HttpRequestException과 관련된 사용 패턴을 보여줄 수 있습니까?
의 관용적 사용법은 EnsureSuccessStatusCode
특정 방식으로 실패 사례를 처리하고 싶지 않을 때 요청의 성공을 간결하게 확인하는 것입니다. 이것은 클라이언트의 프로토 타입을 빠르게 만들고 싶을 때 특히 유용합니다.
특정 방식으로 실패 사례를 처리하기로 결정한 경우 다음을 수행하지 마십시오.
var response = await client.GetAsync(...);
try
{
response.EnsureSuccessStatusCode();
// Handle success
}
catch (HttpRequestException)
{
// Handle failure
}
이것은 즉시 그것을 잡기 위해 예외를 던집니다. 이 목적을 위해 의 IsSuccessStatusCode
속성 HttpResponseMessage
이 있습니다. 대신 다음을 수행하십시오.
var response = await client.GetAsync(...);
if (response.IsSuccessStatusCode)
{
// Handle success
}
else
{
// Handle failure
}
나는 의미있는 것을 반환하지 않기 때문에 ensureSuccessStatusCode를 좋아하지 않습니다. 그래서 내 자신의 확장 프로그램을 만들었습니다.
public static class HttpResponseMessageExtensions
{
public static async Task EnsureSuccessStatusCodeAsync(this HttpResponseMessage response)
{
if (response.IsSuccessStatusCode)
{
return;
}
var content = await response.Content.ReadAsStringAsync();
if (response.Content != null)
response.Content.Dispose();
throw new SimpleHttpResponseException(response.StatusCode, content);
}
}
public class SimpleHttpResponseException : Exception
{
public HttpStatusCode StatusCode { get; private set; }
public SimpleHttpResponseException(HttpStatusCode statusCode, string content) : base(content)
{
StatusCode = statusCode;
}
}
Microsoft의 ensureSuccessStatusCode에 대한 소스 코드는 여기 에서 찾을 수 있습니다.
SO 링크를 기반으로 한 동기 버전 :
public static void EnsureSuccessStatusCode(this HttpResponseMessage response)
{
if (response.IsSuccessStatusCode)
{
return;
}
var content = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
if (response.Content != null)
response.Content.Dispose();
throw new SimpleHttpResponseException(response.StatusCode, content);
}
What I don't like about IsSuccessStatusCode is that it is not "nicely" reusable. For example you can use library like polly to repeat a request in case of network issue. In that case you need your code to raise exception so that polly or some other library can handle it...
I use EnsureSuccessStatusCode when I don't want to handle the Exception on the same method.
public async Task DoSomethingAsync(User user)
{
try
{
...
var userId = await GetUserIdAsync(user)
...
}
catch(Exception e)
{
throw;
}
}
public async Task GetUserIdAsync(User user)
{
using(var client = new HttpClient())
{
...
response = await client.PostAsync(_url, context);
response.EnsureSuccesStatusCode();
...
}
}
The Exception thrown on GetUserIdAsync will be handled on DoSomethingAsync.
'programing tip' 카테고리의 다른 글
Python에서 사전을 복사하는 빠른 방법 (0) | 2020.09.10 |
---|---|
Android 4.1 : 애플리케이션에 대한 알림이 비활성화되었는지 확인하는 방법은 무엇입니까? (0) | 2020.09.09 |
열거 형이 Swift의 프로토콜을 준수하도록 만드는 방법은 무엇입니까? (0) | 2020.09.09 |
LINQ Distinct 연산자, 대소 문자 무시? (0) | 2020.09.09 |
aspx 페이지의 if 문 (0) | 2020.09.09 |