programing tip

ensureSuccessStatusCode 사용 및 발생하는 HttpRequestException 처리

itbloger 2020. 9. 9. 07:48
반응형

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.

참고URL : https://stackoverflow.com/questions/21097730/usage-of-ensuresuccessstatuscode-and-handling-of-httprequestexception-it-throws

반응형