programing

동기식 연결에 HttpClient를 사용하는 이유

i4 2023. 5. 16. 22:11
반응형

동기식 연결에 HttpClient를 사용하는 이유

저는 API와 상호 작용하기 위해 클래스 라이브러리를 구축하고 있습니다.API를 호출하여 XML 응답을 처리해야 합니다.를 사용함으로써 얻을 수 있는 이점을 알 수 있습니다.HttpClient비동기식 연결의 경우, 하지만 내가 하는 일은 순전히 동기식이기 때문에 사용하는 것보다 더 큰 이점을 볼 수 없습니다.HttpWebRequest.

누군가 빛을 비출 수 있다면 대단히 감사하겠습니다.저는 그것을 위해 새로운 기술을 사용하는 사람이 아닙니다.

하지만 제가 하는 일은 순전히 동기적인 것입니다.

사용할 수 있습니다.HttpClient동기식 요청의 경우 문제 없습니다.

using (var client = new HttpClient())
{
    var response = client.GetAsync("http://google.com").Result;

    if (response.IsSuccessStatusCode)
    {
        var responseContent = response.Content; 

        // by calling .Result you are synchronously reading the result
        string responseString = responseContent.ReadAsStringAsync().Result;

        Console.WriteLine(responseString);
    }
}

사용해야 하는 이유에 대해서는HttpClient위에WebRequest걱정되는 건, 음,HttpClient새로 온 아이이고 이전 고객보다 개선된 점을 포함할 수 있습니다.

도니 V.의 대답과 조쉬의 대답을 반복합니다.

"비동기 버전을 사용하지 않는 유일한 이유는 이전 버전을 지원하려는 경우입니다.비동기식 지원이 내장되어 있지 않은 NET"

(그리고 내가 명성이 있다면 투표하세요.)

지난번에도 기억이 나지 않는데, HttpWebRequest가 상태 코드 >= 400에 대한 예외를 던져준 사실에 감사했습니다.이러한 문제를 해결하려면 예외를 즉시 파악하고 코드의 일부 비 예외 응답 메커니즘에 매핑해야 합니다.그 자체로 지루하고 지루하며 오류가 발생하기 쉽습니다.데이터베이스와 통신하든 맞춤형 웹 프록시를 구현하든 상관없이 Http 드라이버는 항상 반환된 내용을 응용 프로그램 코드에 알려주고 사용자의 행동 결정에 맡기는 것이 '거의' 바람직합니다.

따라서 HttpClient가 더 좋습니다.

지금 이 일을 마주치는 사람들을 위해, .NET 5.0에 동기식이 추가되었습니다.Send하는 방법.HttpClient. https://github.com/dotnet/runtime/pull/34948

여기서 자세히 논의되었는지에 대한 장점: https://github.com/dotnet/runtime/issues/32125

따라서 이 기능을 대신 사용할 수 있습니다.SendAsync.예를들면

public string GetValue()
{
    var client = new HttpClient();
            
    var webRequest = new HttpRequestMessage(HttpMethod.Post, "http://your-api.com")
    {
        Content = new StringContent("{ 'some': 'value' }", Encoding.UTF8, "application/json")
    };

    var response = client.Send(webRequest);

    using var reader = new StreamReader(response.Content.ReadAsStream());
            
    return reader.ReadToEnd();
}

이 코드는 단순화된 예시일 뿐입니다. 프로덕션 준비가 되지 않았습니다.

public static class AsyncHelper  
{
    private static readonly TaskFactory _taskFactory = new
        TaskFactory(CancellationToken.None,
                    TaskCreationOptions.None,
                    TaskContinuationOptions.None,
                    TaskScheduler.Default);

    public static TResult RunSync<TResult>(Func<Task<TResult>> func)
        => _taskFactory
            .StartNew(func)
            .Unwrap()
            .GetAwaiter()
            .GetResult();

    public static void RunSync(Func<Task> func)
        => _taskFactory
            .StartNew(func)
            .Unwrap()
            .GetAwaiter()
            .GetResult();
}

그리고나서

AsyncHelper.RunSync(() => DoAsyncStuff());

만약 당신이 당신의 비동기 메서드를 매개 변수로 사용한다면, 당신은 안전한 방법으로 동기 메서드의 비동기 메서드를 호출할 수 있습니다.

여기에 설명되어 있습니다. https://cpratt.co/async-tips-tricks/

클래스 라이브러리를 작성하는 경우 라이브러리 사용자가 라이브러리를 비동기식으로 사용할 수 있습니다.그것이 바로 거기에 있는 가장 큰 이유라고 생각합니다.

또한 라이브러리가 어떻게 사용될지도 모릅니다.아마도 사용자는 많은 요청을 처리할 것이며 비동기식으로 처리하면 더 빠르고 효율적으로 수행할 수 있습니다.

쉽게 처리할 수 있는 경우 라이브러리 사용자가 처리할 수 있을 때 흐름을 비동기화하려는 사용자에게 부담을 주지 않도록 하십시오.

비동기 버전을 사용하지 않는 유일한 이유는 이전 버전을 지원하려는 경우입니다.기본 제공 비동기 지원이 없는 NET입니다.

저의 경우, 수락된 답변이 작동하지 않았습니다.비동기 작업이 없는 MVC 애플리케이션에서 API를 호출하고 있었습니다.

이렇게 해서 성공할 수 있었습니다.

private static readonly TaskFactory _myTaskFactory = new TaskFactory(CancellationToken.None, TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.Default);
public static T RunSync<T>(Func<Task<T>> func)
    {           
        CultureInfo cultureUi = CultureInfo.CurrentUICulture;
        CultureInfo culture = CultureInfo.CurrentCulture;
        return _myTaskFactory.StartNew<Task<T>>(delegate
        {
            Thread.CurrentThread.CurrentCulture = culture;
            Thread.CurrentThread.CurrentUICulture = cultureUi;
            return func();
        }).Unwrap<T>().GetAwaiter().GetResult();
    }

그리고 나서 저는 이렇게 불렀습니다.

Helper.RunSync(new Func<Task<ReturnTypeGoesHere>>(async () => await AsyncCallGoesHere(myparameter)));

현재 시대에, 이 질문에 대한 가장 짧은 대답은 매우 간단합니다: 문자 그대로 다른 모든 것이 우선입니다.NET HttpClient이제는 더 이상 사용되지 않습니다.

언급URL : https://stackoverflow.com/questions/14435520/why-use-httpclient-for-synchronous-connection

반응형