Пользовательский заголовок подтверждения не работает на 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-запросы.

Другие вопросы по тегам