c# - servicio - No se envía el encabezado de autenticación HttpClient
xamarin api rest (4)
En realidad, su problema es con PostAsync
; debe usar SendAsync
. En su código: client.PostAsync(Uri, request.Content);
envía solo el contenido que los encabezados del mensaje de solicitud no están incluidos. La forma correcta es:
HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, url)
{
Content = content
};
message.Headers.Authorization = new AuthenticationHeaderValue("Basic", credentials);
httpClient.SendAsync(message);
Estoy tratando de usar un HttpClient
para un servicio de terceros que requiere autenticación HTTP básica. Estoy usando el AuthenticationHeaderValue
. Esto es lo que he encontrado hasta ahora:
HttpRequestMessage<RequestType> request =
new HttpRequestMessage<RequestType>(
new RequestType("third-party-vendor-action"),
MediaTypeHeaderValue.Parse("application/xml"));
request.Headers.Authorization = new AuthenticationHeaderValue(
"Basic", Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", "username", "password"))));
var task = client.PostAsync(Uri, request.Content);
ResponseType response = task.ContinueWith(
t =>
{
return t.Result.Content.ReadAsAsync<ResponseType>();
}).Unwrap().Result;
Parece que la acción POST funciona bien, pero no recupero los datos que espero. A través de algunas pruebas y errores, y finalmente usando Fiddler para detectar el tráfico sin procesar, descubrí que no se estaba enviando el encabezado de autorización.
He visto this , pero creo que tengo el esquema de autenticación especificado como parte del constructor AuthenticationHeaderValue
.
¿Hay algo que me haya perdido?
Esto también funcionaría y no tendría que lidiar con las conversiones de cadena base64:
var handler = new HttpClientHandler();
handler.Credentials = new System.Net.NetworkCredential("username", "password");
var client = new HttpClient(handler);
...
Intenta establecer el encabezado en el cliente:
DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes(String.Format("{0}:{1}", userName, password))));
Esto funciona para mí.
Parece que su código debería funcionar. Recuerdo que me encontré con un problema similar al configurar los encabezados de Autorización y que se resolvió haciendo Headers.Add () en lugar de configurarlo:
request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "username", "password"))));
ACTUALIZACIÓN: Parece que cuando realiza una solicitud. Contenido, no todos los encabezados se reflejan en el objeto de contenido. Puede ver esto inspeccionando request.Headers vs request.Content.Headers. Una cosa que quizás quieras probar es usar SendAsync en lugar de PostAsync. Por ejemplo:
HttpRequestMessage<RequestType> request =
new HttpRequestMessage<RequestType>(
new RequestType("third-party-vendor-action"),
MediaTypeHeaderValue.Parse("application/xml"));
request.Headers.Authorization =
new AuthenticationHeaderValue(
"Basic",
Convert.ToBase64String(
System.Text.ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", "username", "password"))));
request.Method = HttpMethod.Post;
request.RequestUri = Uri;
var task = client.SendAsync(request);
ResponseType response = task.ContinueWith(
t =>
{ return t.Result.Content.ReadAsAsync<ResponseType>(); })
.Unwrap().Result;