the notification notificaciones net firebasenet fcmsharp fcm example c# dotnet-httpclient google-cloud-messaging

notification - notificaciones push firebase c#



La adición de encabezados HttpClient genera una excepción FormatException con algunos valores (5)

Esto ocurrió en el contexto de la codificación en Google Cloud Messaging, pero se aplica en otros lugares.

Considera lo siguiente:

var http = new HttpClient(); http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("key=XXX");

y

var http = new HttpClient(); http.DefaultRequestHeaders.Add("Authorization", "key=XXX");

ambos de los cuales generan una excepción FormatException:

System.FormatException: el formato de la clave de valor = XXX ''no es válido.

La solución es eliminar el signo igual.

  1. Cavar en el reflector muestra que hay montones de validación y código de análisis que se ejecutan al agregar un nuevo valor de encabezado. ¿Por qué es necesario todo esto? ¿No debería este cliente simplemente salir de nuestro camino?

  2. ¿Cómo escapar del signo igual para que la adición de este valor tenga éxito?


En mi caso, estoy generando valores de cadena ETags desde un campo SQL byte [] RowVersion. Así que necesito agregar envolver el generado. es decir, AAAAAAAAF5s = cadena dentro de "como sigue ...

var eTag = department.RowVersion.ToETagString(); httpClient.DefaultRequestHeaders.Add(Microsoft.Net.Http.Headers.HeaderNames.IfMatch, $"/"{eTag}/"") public class DepartmentForHandleDto { public string Name { get; set; } public string GroupName { get; set; } public byte[] RowVersion { get; set; } } public static class ByteArrayExtensions { public static string ToETagString(this byte[] byteArray) { return Convert.ToBase64String(byteArray != null && byteArray.Length > 0 ? byteArray : new byte[8]); } }


He estado haciendo algunas preguntas esta mañana al tratar con una API externa que no cumple con las especificaciones HTTP de la letra.

Como parte de mi publicación, quieren el Content-Type Content-Disposition , que no se pueden agregar al objeto HttpClient . Para agregar esos encabezados, necesita crear un HttpRequestMessage . Allí, debe agregar los encabezados a la propiedad Content .

private HttpRequestMessage GetPostMessage(string uri, string contentType, string fileName, Stream content) { var request = new HttpRequestMessage { Content = new StreamContent(content), RequestUri = new Uri(uri), Method = HttpMethod.Post }; // contentType = "video/mp4" request.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); //Need TryAddWithoutValidation because of the equals sign in the value. request.Content .Headers .TryAddWithoutValidation("Content-Disposition", $"attachment; filename=/"{Path.GetFileName(fileName)}/""); // If there is no equals sign in your content disposition, this will work: // request.Content.Headers.ContentDisposition = // new ContentDispositionHeaderValue($"attachment; /"{Path.GetFileName(fileName)}/""); return request; }


No estoy seguro de si aún es relevante, pero recientemente me encontré con el mismo problema y pude resolverlo llamando a un método diferente para agregar la información del encabezado:

var http = new HttpClient(); http.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=XXX");


Para su pregunta "por qué es necesario todo esto (análisis y validación)", la respuesta es: está definida en el estándar HTTP.

En HTTP/1.1 y RFC2617 , el valor de un encabezado de autenticación (como WWW-Autenticación y Autorización) tiene dos partes: una parte de esquema y una parte de parámetro .

Para la autenticación básica HTTP, el esquema es "Básico", y el parámetro puede ser algo como "QWxhZGRpbjpvcGVuIHNlc2FtZQ ==" , por lo que todo el encabezado se convierte en:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Es por eso que su "clave = XXX" no pasa la validación, porque carece de una parte del esquema.


Resolví esta excepción (mi FormatException causada por comas en el valor) configurando el encabezado de Autorización de la siguiente manera:

var authenticationHeaderValue = new AuthenticationHeaderValue("some scheme", "some value"); client.DefaultRequestHeaders.Authorization = authenticationHeaderValue;