tipos solo poner pie para paginas pagina mismo hoja encabezados encabezado documento diferentes diferente descargar como cada algunas c# .net oauth authorization dotnet-httpclient

c# - solo - HttpClient instancia única con diferentes encabezados de autenticación



encabezados diferentes en un mismo documento (1)

Si sus encabezados suelen ser los mismos, puede configurar DefaultRequestHeaders . Pero no necesita usar esa propiedad para especificar encabezados. Como ha determinado, eso simplemente no funcionaría si va a tener múltiples hilos usando el mismo cliente. Los cambios en los encabezados predeterminados realizados en un subproceso afectarían las solicitudes enviadas en otros subprocesos.

Aunque puede establecer encabezados predeterminados en el cliente y aplicarlos a cada solicitud, los encabezados son realmente propiedades de la solicitud. Entonces, cuando los encabezados son específicos de una solicitud, simplemente los agrega a la solicitud.

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

Eso significa que no puede utilizar los métodos simplificados que no implican crear una HttpRequest . Tendrás que usar

public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request)

documentado here .

Ejemplo de métodos GET y POST realizados a través de un método de extensión que le permite manipular el encabezado de la solicitud y más de HttpRequestMessage antes de enviarlo:

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); }

Estos podrían ser utilizados de la siguiente manera:

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

Dado que .net HttpClient ha sido diseñado teniendo en cuenta la reutilización y está destinado a ser de larga duración y se han informado pérdidas de memoria en instancias de corta duración. ¿Qué líneas de guía hay para realizar llamadas relajantes a un punto final determinado utilizando diferentes tokens de portador (o cualquier encabezado de autorización) al llamar al punto final para múltiples usuarios?

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

Dado que el código anterior podría ser llamado por cualquier número de hilos en una aplicación web, es fácilmente posible que el encabezado establecido en la primera línea no sea el mismo que se usa al llamar al recurso.

Sin causar contención usando bloqueos y manteniendo una aplicación web sin estado, ¿cuál es el enfoque recomendado para crear y eliminar HttpClients para un único punto final (mi práctica actual es crear un solo cliente por punto final)?

Ciclo vital

Aunque HttpClient implementa indirectamente la interfaz IDisposable, el uso recomendado de HttpClient no es deshacerse de ella después de cada solicitud. El objeto HttpClient está destinado a vivir mientras su aplicación necesite realizar solicitudes HTTP. Tener un objeto en varias solicitudes habilita un lugar para configurar DefaultRequestHeaders y evita que tenga que respetar cosas como CredentialCache y CookieContainer en cada solicitud, como era necesario con HttpWebRequest.