Dies geschah im Rahmen der Codierung gegen Google Cloud Messaging, gilt jedoch 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 generieren eine FormatException:
System.FormatException: Das Format des Wertschlüssels = XXX 'ist ungültig.
Die Lösung besteht darin, das Gleichheitszeichen zu entfernen.
Das Durchsuchen des Reflektors zeigt, dass es Unmengen von Validierungs- und Parsing-Code gibt, die ausgeführt werden, wenn ein neuer Header-Wert hinzugefügt wird. Warum ist das alles notwendig? Sollte dieser Kunde uns nicht einfach aus dem Weg gehen?
Wie entkommen Sie dem Gleichheitszeichen, damit das Hinzufügen dieses Werts erfolgreich ist?
Antworten:
Ich bin mir nicht sicher, ob es noch relevant ist, aber ich bin kürzlich auf dasselbe Problem gestoßen und konnte es lösen, indem ich eine andere Methode zum Hinzufügen der Header-Informationen aufrief:
var http = new HttpClient(); http.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=XXX");
quelle
HttpRequestMessage
stattdessen zu verwenden, und es machte keinen Unterschied. DieTryAddWithoutValidation
Methode hat den Trick für mich getan.Auf Ihre Frage "Warum ist all dies (Analyse und Validierung) notwendig?" Lautet die Antwort: Sie ist im HTTP-Standard definiert.
In HTTP / 1.1 und RFC2617 besteht der Wert eines Authentifizierungsheaders (z. B. WWW-Authentifizierung und Autorisierung) aus zwei Teilen: einem Schemateil und einem Parameterteil .
Für die HTTP- Basisauthentifizierung lautet das Schema "Basis", und der Parameter kann etwa "QWxhZGRpbjpvcGVuIHNlc2FtZQ ==" lauten , sodass der gesamte Header wie folgt lautet :
Aus diesem Grund besteht Ihr "key = XXX" die Validierung nicht, da ihm ein Schemateil fehlt.
quelle
Bearer
als Schema, aber es zeigt mir immer noch den Fehler.Ich habe diese Ausnahme (meine FormatException, die durch Kommas im Wert verursacht wird) umgangen, indem ich den Authorization-Header folgendermaßen festgelegt habe:
var authenticationHeaderValue = new AuthenticationHeaderValue("some scheme", "some value"); client.DefaultRequestHeaders.Authorization = authenticationHeaderValue;
quelle
Ich bin auf diesen Fehler gestoßen und bin auf diesen Beitrag gestoßen, als ich am Ende eines Autorisierungsheaders ein Leerzeichen eingefügt habe.
this.bearerAuthHttpClient.DefaultRequestHeaders.Add("Authorization ", $"Bearer {token}");
Sie können das beleidigende "" nach der Autorisierung sehen.
Es dauerte ungefähr 15 Minuten, bis ich meinen Tippfehler sah ...
quelle
Ich habe heute Morgen einige Fragen durchgearbeitet, während ich mich mit einer externen API befasst habe, die nicht genau der HTTP-Spezifikation entspricht.
Als Teil meines Beitrags möchten sie das
Content-Type
undContent-Disposition
, das demHttpClient
Objekt nicht hinzugefügt werden kann. Um diese Header hinzuzufügen, müssen Sie eine HttpRequestMessage erstellen . Dort müssen Sie die Header zurContent
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; }
quelle
In meinem Fall generiere ich ETags-Zeichenfolgenwerte aus einem Byte [] RowVersion SQL-Feld. Also muss ich den generierten Wrap hinzufügen. dh AAAAAAAAF5s = Zeichenfolge innerhalb "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]); } }
quelle