Program Tip

인증 헤더가 다른 HttpClient 단일 인스턴스

programtip 2020. 12. 5. 10:31
반응형

인증 헤더가 다른 HttpClient 단일 인스턴스


주어진 .NET HttpClient를 염두에 재사용 설계되었으며하기위한 것입니다 그 정든메모리 누수가보고되었다 수명이 짧은 경우에. 여러 사용자를 위해 엔드 포인트를 호출 할 때 서로 다른 베어러 토큰 (또는 권한 헤더)을 사용하여 주어진 엔드 포인트에 대해 안정된 호출을 할 수있는 지침은 무엇입니까?

private void CallEndpoint(string resourceId, string bearerToken) {
  httpClient.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("bearer", bearerToken);
  var response = await httpClient.GetAsync($"resource/{resourceid}");
}

위의 코드가 웹 애플리케이션의 스레드 수에 관계없이 호출 될 수 있다는 점을 감안할 때 첫 번째 줄에 설정된 헤더가 리소스를 호출 할 때 사용되는 헤더와 같지 않을 가능성이 있습니다.

잠금을 사용하여 경합을 일으키지 않고 상태 비 저장 웹 애플리케이션을 유지하지 않고 단일 엔드 포인트에 대해 HttpClient를 생성하고 폐기하는 데 권장되는 접근 방식은 무엇입니까 (현재 관행은 엔드 포인트 당 단일 클라이언트를 생성하는 것입니다)?


라이프 사이클

HttpClient는 IDisposable 인터페이스를 간접적으로 구현하지만 HttpClient의 권장 사용법은 모든 요청 후이를 폐기하지 않는 것입니다. HttpClient 개체는 애플리케이션이 HTTP 요청을해야하는 한 유지되도록 설계되었습니다. 여러 요청에 개체가 있으면 DefaultRequestHeaders를 설정할 수 있고 HttpWebRequest에서 필요했던 것처럼 모든 요청에 ​​대해 CredentialCache 및 CookieContainer와 같은 항목을 다시 지정하지 않아도됩니다.


헤더가 일반적으로 동일 할 경우 DefaultRequestHeaders. 그러나 헤더를 지정하기 위해 해당 속성을 사용할 필요는 없습니다. 확인했듯이 동일한 클라이언트를 사용하는 여러 스레드를 사용하려는 경우 작동하지 않습니다. 한 스레드에서 수행 된 기본 헤더를 변경하면 다른 스레드에서 전송 된 요청에 영향을 미칩니다.

클라이언트에서 기본 헤더를 설정하고 각 요청에 적용 할 수 있지만 헤더는 실제로 요청의 속성입니다. 따라서 헤더가 요청에 특정한 경우 요청에 추가하기 만하면됩니다.

request.Headers.Authorization = new AuthenticationHeaderValue("bearer", bearerToken);

즉, .NET Framework를 생성하지 않는 단순화 된 방법을 사용할 수 없습니다 HttpRequest. 당신은 사용해야합니다

public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request)

여기에 문서화되어 있습니다 .

요청 헤더를 조작 할 수있는 확장 메소드를 통해 수행 된 GET 및 POST 메소드의 예 HttpRequestMessage는 전송되기 전에 다음 같습니다.

public static Task<HttpResponseMessage> GetAsync
    (this HttpClient httpClient, string uri, Action<HttpRequestMessage> preAction)
{
    var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, uri);

    preAction(httpRequestMessage);

    return httpClient.SendAsync(httpRequestMessage);
}

public static Task<HttpResponseMessage> PostAsJsonAsync<T>
    (this HttpClient httpClient, string uri, T value, Action<HttpRequestMessage> preAction)
{
    var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, uri)
    {
        Content = new ObjectContent<T>
            (value, new JsonMediaTypeFormatter(), (MediaTypeHeaderValue)null)
    };
    preAction(httpRequestMessage);

    return httpClient.SendAsync(httpRequestMessage);
}

그런 다음 다음과 같이 사용할 수 있습니다.

var response = await httpClient.GetAsync("token",
    x => x.Headers.Authorization = new AuthenticationHeaderValue("basic", clientSecret));

참고 URL : https://stackoverflow.com/questions/37928543/httpclient-single-instance-with-different-authentication-headers

반응형