Пользовательский заголовок подтверждения не работает на Windows Phone 8
У меня есть класс в Portable Class Library (предназначенный для.NET 4.5 и Windows Phone 8.1), который использует класс HttpClient (System.Net.Http.HttpClient) для публикации строки в веб-службе. Служба требует, чтобы я установил заголовок Accept в запросе, чтобы указать версию API следующим образом:
Accept: vnd.servicehost.v1+json
Я попробовал это в моем классе, как это:
_httpClient.DefaultRequestHeaders.Add("Accept", "vnd.servicehost.v1+json");
И он генерирует исключение FormatException, заявляющее, что мой заголовок Accept недействителен. Поэтому я пытаюсь установить это так:
_httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("vnd.servicehost.v1+json"));
И это все еще бросает FormatException. Я нашел этот ответ, который убедил меня попробовать использовать TryAddWithoutValidation()
метод как это:
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "vnd.servicehost.v1+json");
Наконец, я не получаю FormatException! Мой метод post работает, когда я вызываю его из моего проекта модуля тестирования.NET 4.5. Я получаю обратно 200 с данными, которые я ожидал. Однако, когда я вызываю тот же метод из моего Windows Phone 8.1 (или эмулятора), служба отвечает, что версия, указанная в моем запросе, недействительна.
Я не могу понять, как заставить Fiddler показывать мне трафик из моего эмулятора Windows Phone, чтобы увидеть, как выглядит фактический запрос. Я предполагаю, что заголовок Accept никогда не добавляется. Я надеюсь, что опытный разработчик Windows Phone сможет распознать очевидную ошибку, которую я совершаю...
3 ответа
Вы можете использовать Windows.Web.Http.HttpClient
вместо System.Net.Http.HttpClient
т.е.
HttpClient _httpClient = new HttpClient();
bool result = _httpClient.DefaultRequestHeaders.TryAppendWithoutValidation("Accept", "vnd.servicehost.v1+json");
var response = await _httpClient.GetAsync(uri);
В windows phone 8
использовать можно использовать WebClient
для этого вроде:
WebClient clt = new WebClient();
clt.Headers["Content-Type"] = "application/json";
clt.Headers["Accept"] = "vnd.servicehost.v1+json";
clt.UploadStringAsync(new Uri(uri, "{}");
ПРИМЕЧАНИЕ: я не уверен в этом, так как я не проверял, но вы можете попробовать
В моей Windows Phone/Windows Library я использую
client.DefaultRequestHeaders.TryAddWithoutValidation()
и работает нормально. Так что ваши
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "vnd.servicehost.v1+json");
также должно быть в порядке. Единственный способ узнать наверняка - увидеть фактический трафик с телефона на сервер.
Заставить Fiddler работать с эмулятором нетривиально (я никогда этого не делал), но захват трафика с реального устройства довольно прост.
В Fiddler в настройках вы должны разрешить удаленные подключения и перезапустить Fiddler. Затем в устройстве убедитесь, что вы подключены к той же сети, что и ваш компьютер, и в настройках Wi-Fi установите для прокси-сервера значение your_computer_ip:8888. Весь трафик теперь должен проходить через Fiddler, и вы увидите, нормально ли выглядят http-запросы.