wake-up-neo.com

Durch das Hinzufügen von HttpClient-Headern wird eine FormatException mit einigen Werten generiert

Dies geschah im Zusammenhang mit der Kodierung gegen Google Cloud Messaging, gilt jedoch auch an anderer Stelle.

Folgendes berücksichtigen:

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

und

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

beide erzeugen eine FormatException:

System.FormatException: Das Format des Wertschlüssels = XXX 'ist ungültig.

Die Lösung besteht darin, das Gleichheitszeichen zu entfernen.

  1. Ein Blick in den Reflektor zeigt, dass es unzählige Validierungs- und Analysecodes gibt, die ausgeführt werden, wenn ein neuer Header-Wert hinzugefügt wird. Warum ist das alles notwendig? Sollte dieser Kunde nicht einfach aus dem Weg gehen?

  2. Wie entkommen Sie dem Gleichheitszeichen, damit das Hinzufügen dieses Werts erfolgreich ist?

54
Andrew

Nicht sicher, ob immer noch relevant, aber kürzlich bin ich auf dasselbe Problem gestoßen und konnte es lösen, indem ich eine andere Methode aufrief, um die Headerinformationen hinzuzufügen:

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

Auf Ihre Frage "Warum ist das alles (Analysieren und Validieren) notwendig?" Lautet die Antwort: es ist im HTTP-Standard definiert. 

In HTTP/1.1 und RFC2617 besteht der Wert eines Authentifizierungsheaders (z. B. WWW-Authenticate und Authorization) aus zwei Teilen: einem Schemateil und einem Parameterteil

Bei der HTTP-Basisauthentifizierung lautet das Schema "Basic", und der Parameter könnte etwa "QWxhZGRpbjpvcGVuIHNl2FtZQ ==" sein, sodass der gesamte Header zu:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Aus diesem Grund besteht Ihr Schlüssel "key = XXX" nicht für die Validierung, da ihm ein Schemateil fehlt.

16
Terry Chang

Ich bin um diese Ausnahme herumgekommen (meine FormatException, die durch Kommas im Wert verursacht wurde), indem ich den Authorization-Header auf folgende Weise setzte:

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

Ich bin auf diesen Fehler gestoßen und auf diesen Beitrag gestoßen, als ich am Ende eines Authorization-Headers ein Leerzeichen eingefügt habe.

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

Sie können den Verstoß nach der Autorisierung sehen.

Es dauerte ungefähr 15 Minuten, bis ich meinen Tippfehler sah ...

2
Robert Stokes

Ich habe heute Morgen ein paar Fragen durchgegangen, während ich mich mit einer externen API befasste, die nicht der HTTP-Spezifikation entspricht.

Als Teil meines Beitrags möchten sie Content-Type und Content-Disposition, die nicht zum HttpClient-Objekt hinzugefügt werden können. Um diese Header hinzuzufügen, müssen Sie eine HttpRequestMessage erstellen. Dort müssen Sie die Header zur Content-Eigenschaft hinzufügen.

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

In meinem Fall generiere ich ETags-String-Werte aus einem Byte [] RowVersion-SQL-Feld . Ich muss also das generierte Wrap hinzufügen. d. h. AAAAAAAAF5s = Zeichenfolge "wie folgt ..." 

        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]);                    
        }
    }
0
alhpe