2014-02-17 1 views
2

Учитывая следующий System.Net.Http.HttpClientPortable Class Library бросает исключение:Экземпляр System.Net.Http.HttpClient генерирует исключение при настройке запятой. Зачем?

var httpClient = new HttpClient(); 
httpClient.DefaultRequestHeaders.Add("Authorization", "aaaa,bbbb"); 

Исключение составляет: Неверный формат

в System.Net.Http.Headers.HttpHeaders.AddInternal (System.String имя , IEnumerable 1 values, System.Net.Http.Headers.HeaderInfo headerInfo, Boolean ignoreInvalid) [0x0004c] in /Developer/MonoTouch/Source/mono/mcs/class/System.Net.Http/System.Net.Http.Headers/HttpHeaders.cs:195 at System.Net.Http.Headers.HttpHeaders.Add (System.String name, IEnumerable 1 значения) [0x00011] в /Developer/MonoTouch/Source/mono/mcs/class/System.Net.Http/System.Net.Http.Headers/HttpHeaders.cs:170 at System.Net .Http.Headers.HttpHeaders.Add (имя System.String, значение System.String) [0x00000] в /Developer/MonoTouch/Source/mono/mcs/class/System.Net.Http/System.Net.Http. Заголовки/HttpHeaders < ... чик ...>

Теперь это происходит только при следующих

ключа заголовка = Authorization. Если вы измените это на что-нибудь еще, все в порядке. Значение = должно иметь в себе запятую.

Теперь этот предыдущий вопрос SO предполагает, что запятая является правильным способом вставить несколько значений в заголовок.

Может ли кто-нибудь объяснить, что происходит?

ПРИМЕЧАНИЕ. Это на Xamarin, поэтому я думаю, что это моно. Не уверен, что это важно.

UPDATE:

вот рис этого.

enter image description here

+1

Это трассировка стека, в чем исключение? – CodeCaster

+0

Обновлено. упс. soz об этом. –

+0

Исключение указывает, что это недопустимый формат. Почему вы пытаетесь установить запятую в этом заголовке? – CodeCaster

ответ

5

Согласно this links spec rfc2617 отделяя запятой кажется действительным.

«Он использует расширяемую, без учета регистра маркера для идентификации схемы аутентификации, , за которым следует разделенный запятыми список пар атрибут-значение, которые несут параметры, необходимые для достижения аутентификации с помощью этой схемы .»

Но в этом он предполагает, что Вы вполне возможно устанавливать их неправильно, они должны иметь форму «пары атрибут-значение»:

auth-param  = token "=" (token | quoted-string) 

Как именно вы их установки?

httpClient.DefaultRequestHeaders.Add("Authorization", "aaaa,bbbb"); 

выше, казалось бы, недействительны, они не связывают пары «аааа, BBBB». Для атрибута, который вы пытаетесь установить, нет знака no =.

Попробуйте следующее в качестве теста:

httpClient.DefaultRequestHeaders.Add("Authorization", "aaaa=1234,bbbb=45678"); 
+0

Но значение, которое я хочу установить для поля авторизации, это «aaa, bbb» .. не результат ключа/значения. Тогда только мой сервер, я разделил это * значение * на запятую и предположим, что первый сегмент - Foo, а второй сегмент - Bah. –

+0

Ну, вы не можете, вам придется подумать о чем-то другом. Возможно, вы можете base64-кодировать значение. – CodeCaster

+0

Это только для заголовка AUTHORIZATION? или -any-заголовок? –

2

Существовал ошибка в реализации моно, не допустимые символы в заголовках, т.е.[ и ] - это было исправлено, но для Xamarin Android она не достигла стабильной ветки пока (он придет с Xamarin Android 5)

можно обойти это, если вы не можете ждать, вам нужно отправить прямо сейчас , и вам НЕОБХОДИМО иметь специальные символы в заголовке, есть способ (я теперь отказался от него)

Перед добавлением заголовков вы можете добавить символы в виде разрешенных токенов в заголовках. Это документировано, незаконно (с правильной точки зрения кодирования) и сделано с помощью отражения, но это работает:

var assembly = typeof(System.Net.Http.Headers.HttpContentHeaders).Assembly; 
var lexer = assembly.GetType("System.Net.Http.Headers.Lexer"); 
var field = lexer.GetField("token_chars", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic); 
var tokens = (bool[])field.GetValue(null); 
tokens[91] = true; 
tokens[93] = true; 
field.SetValue(null, tokens); 

В примере выше мы допускаем символ 91 и 93 [и] соответственно.

+0

Обратите внимание, что на более новых Android, у которых есть обновленный Mono (версия 5), приведенный выше код не сработает. Он больше не нужен. Если вам необходимо поддерживать устаревшие среды Mono, перед тем, как использовать ответ, сделайте тест для версии> 5. – Peter

Смежные вопросы