Stało się to w kontekście kodowania w Google Cloud Messaging, ale ma zastosowanie w innych miejscach.
Rozważ następujące:
var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("key=XXX");
i
var http = new HttpClient();
http.DefaultRequestHeaders.Add("Authorization", "key=XXX");
z których oba generują FormatException:
System.FormatException: format klucza wartości = XXX 'jest nieprawidłowy.
Rozwiązaniem jest usunięcie znaku równości.
Przeglądanie reflektora pokazuje, że jest mnóstwo kodu sprawdzającego i analizującego, który działa podczas dodawania nowej wartości nagłówka. Dlaczego to wszystko jest konieczne? Czy ten klient nie powinien po prostu schodzić nam z drogi?
Jak uniknąć znaku równości, aby dodać tę wartość?
Odpowiedzi:
Nie jestem pewien, czy nadal jest to istotne, ale ostatnio napotkałem ten sam problem i udało mi się go rozwiązać, wywołując inną metodę dodawania informacji z nagłówka:
var http = new HttpClient(); http.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", "key=XXX");
źródło
HttpRequestMessage
ale nie miało to znaczenia.TryAddWithoutValidation
Metoda wystarczyły dla mnie.Na Twoje pytanie „dlaczego to wszystko (analiza i walidacja) jest konieczne”? Odpowiedź brzmi: jest to zdefiniowane w standardzie HTTP.
W protokołach HTTP / 1.1 i RFC2617 wartość nagłówka uwierzytelniania (na przykład WWW-Authenticate i Authorization) ma dwie części: część schematu i część dotyczącą parametrów .
W przypadku podstawowego uwierzytelniania HTTP schemat to „Podstawowy”, a parametr może wyglądać mniej więcej tak: „QWxhZGRpbjpvcGVuIHNlc2FtZQ ==” , więc cały nagłówek wygląda następująco :
Dlatego twój „key = XXX” nie przechodzi weryfikacji, ponieważ brakuje mu części schematu.
źródło
Bearer
schematu, ale nadal pokazuje mi błąd.Obejrzałem ten wyjątek (mój FormatException spowodowany przecinkami w wartości), ustawiając nagłówek Authorization w następujący sposób:
var authenticationHeaderValue = new AuthenticationHeaderValue("some scheme", "some value"); client.DefaultRequestHeaders.Authorization = authenticationHeaderValue;
źródło
Napotkałem ten błąd i natknąłem się na ten post, gdy dodałem spację na końcu nagłówka autoryzacji.
this.bearerAuthHttpClient.DefaultRequestHeaders.Add("Authorization ", $"Bearer {token}");
Po autoryzacji możesz zobaczyć obraźliwy plik „”.
Zajęło mi około 15 minut, zanim zobaczyłem swoją literówkę ...
źródło
Dziś rano przeszedłem przez kilka pytań, mając do czynienia z zewnętrznym interfejsem API, który nie jest zgodny ze specyfikacją HTTP co do joty.
W ramach mojego postu chcą
Content-Type
iContent-Disposition
, których nie można dodać doHttpClient
obiektu. Aby dodać te nagłówki, musisz utworzyć HttpRequestMessage . Tam musisz dodać nagłówki doContent
właściwości.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; }
źródło
W moim przypadku generuję wartości ciągu ETags z pola SQL RowVersion bajt []. Więc muszę dodać zawinąć wygenerowany plik. tj. AAAAAAAAF5s = string wewnątrz "w następujący sposób ...
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]); } }
źródło