98 votes

L'ajout d'en-têtes HttpClient génère une FormatException avec certaines valeurs

Ceci s'est produit dans le contexte du codage contre Google Cloud Messaging, mais s'applique ailleurs.

Considérez ce qui suit :

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

et

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

qui génèrent toutes deux une FormatException :

System.FormatException : Le format de la valeur 'key=XXX' est invalide.

La solution consiste à supprimer le signe égal.

  1. En creusant dans reflector, on s'aperçoit qu'il y a des tas de codes de validation et d'analyse qui s'exécutent lors de l'ajout d'une nouvelle valeur d'en-tête. Pourquoi tout cela est-il nécessaire ? Ce client ne devrait-il pas simplement s'écarter de notre chemin ?

  2. Comment échapper au signe égal pour que l'ajout de cette valeur réussisse ?

220voto

Antonio Points 2271

Je ne sais pas si c'est toujours d'actualité, mais j'ai récemment rencontré le même problème et j'ai pu le résoudre en appelant une méthode différente pour ajouter les informations d'en-tête :

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

27voto

Terry Chang Points 539

À votre question "pourquoi tout cela (analyse syntaxique et validation) est-il nécessaire", la réponse est la suivante : elle est définie dans la norme HTTP.

Sur HTTP/1.1 y RFC2617 La valeur d'un en-tête d'authentification (tel que WWW-Authenticate et Authorization) comporte deux parties : une partie schéma, et une partie paramètre .

Pour l'authentification HTTP de base, le schéma est "Basic", et le paramètre peut être quelque chose comme "QWxhZGRpbjpvcGVuIHNlc2FtZQ==" donc l'en-tête entier devient :

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

C'est pourquoi votre "key=XXX" ne passe pas la validation, parce qu'il lui manque un élément de schéma.

10voto

Robert Stokes Points 76

J'ai rencontré cette erreur et suis tombé sur cet article lorsque j'ai ajouté un espace à la fin d'un en-tête d'autorisation.

this.bearerAuthHttpClient.DefaultRequestHeaders.Add("Authorization ", $"Bearer {token}");

Vous pouvez voir le " " offensant après Authorization.

Il m'a fallu environ 15 minutes avant de voir ma faute de frappe...

8voto

CRice Points 4717

J'ai contourné cette exception (mon FormatException causée par les virgules dans la valeur) en définissant l'en-tête Authorization de la manière suivante :

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

1voto

krillgar Points 2791

Je me suis posé quelques questions ce matin en traitant avec une API externe qui ne suit pas la spécification HTTP à la lettre.

Dans le cadre de mon poste, ils veulent Content-Type y Content-Disposition qui ne peut pas être ajouté à la HttpClient objet. Pour ajouter ces en-têtes, vous devez créer un objet HttpRequestMessage . A partir de là, vous devez ajouter les en-têtes au fichier Content propriété.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X