C # UWP Windows.Web.Http.HttpClient Ошибка 401 на Xbox - PullRequest
0 голосов
/ 14 мая 2018

Задача

Я получаю странную 401 несанкционированную ошибку при использовании Windows.Web.Http.HttpClient на Xbox One . На Windows На машинах все работает нормально. Учетные данные в порядке, и я тестировал на 3 разных Xbox One - каждый раз один и тот же результат.

Вот код:

Windows.Web.Http.Filters.HttpBaseProtocolFilter filter = new Windows.Web.Http.Filters.HttpBaseProtocolFilter();
filter.AllowUI = false;
filter.CacheControl.WriteBehavior = Windows.Web.Http.Filters.HttpCacheWriteBehavior.NoCache;
filter.CacheControl.ReadBehavior = Windows.Web.Http.Filters.HttpCacheReadBehavior.NoCache;

Uri uri = new Uri("http://" + url + ":" + port + endpoint);

if (username != "" && password != "")
    filter.ServerCredential = new Windows.Security.Credentials.PasswordCredential(uri.OriginalString, username, password);

try
{
    HttpClient client = new HttpClient(filter);
    HttpResponseMessage response = await client.GetAsync(uri);

    response.EnsureSuccessStatusCode();

    var buffer = await response.Content.ReadAsBufferAsync();
    var byteArray = buffer.ToArray();

    return Encoding.UTF8.GetString(byteArray, 0, byteArray.Length);
}
catch
{
    return null;
}

Вот вывод Fiddler (у меня в жестком коде username / pass zu, чтобы избежать ошибок при наборе).

Xbox One:

GET http://192.168.178.31:XXXX/XXX/XXX HTTP/1.1
Accept-Encoding: gzip, deflate
Host: 192.168.178.31:XXXX
Connection: Keep-Alive
Pragma: no-cache

HTTP/1.1 401 Unauthorized 
Server: XXXX
Cache-Control: no-cache
WWW-Authenticate: Digest realm="XXXX", qop="auth", nonce="516f32c0f120024c220873c1ebc159e4", opaque="2effb29f8b3de0ca6a688330875890c8"
Connection: Keep-Alive
Content-Type: text/html
Content-Length: 432

Windows

GET http://192.168.178.31:XXXX/XXX/XXX HTTP/1.1
Accept-Encoding: gzip, deflate
Host: 192.168.178.31:XXXX
Connection: Keep-Alive
Pragma: no-cache

HTTP/1.1 200 OK

Спасибо

Я снова создал небольшое приложение с несколькими строками кода. Теперь с System.NET.Http вместо Windows.Web.Http.

Странная вещь в том, что я получаю такой результат в фиддлере:

Windows

HTTP 401 Text/Html
HTTP 200 Text/x-json

Xbox:

HTTP 401 Text/Html
HTTP 401 Text/Html

Обход:

Сейчас я использую оба метода, если один не удается, он пытается использовать другой:

if (!digestFailed)
    filter.ServerCredential = new Windows.Security.Credentials.PasswordCredential(uri.OriginalString, username, password);
else
    request.Headers.Authorization = new HttpCredentialsHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", username, password))));

Но, похоже, на Xbox One есть большая проблема. Я играл с веб-сервером. Если на сервере установить аутентификацию только для дайджеста , Xbox будет неспособным подключиться! Поэтому я думаю, что что-то не так с генерацией дайджеста на Xbox с Windows.Security.Credentials.PasswordCredential ?

Чтобы было понятно:

  • Базовая аутентификация сервера:

    • Windows OK
    • Xbox ОК
  • Дайджест аутентификации сервера:

    • Windows OK
    • Xbox СБОЙ
  • Дайджест аутентификации сервера + Basic:

    • Windows OK (Аутентифицировано с помощью дайджеста)
    • Xbox OK (Аутентифицировано с помощью Basic Auth)

1 Ответ

0 голосов
/ 15 мая 2018

На вашем месте я бы определенно сделал то, что @janniks предложил в своем комментарии - осмотрите Exception, который вы получаете.

Что более важно, хотя, по крайней мере, в таких случаях у вас должен быть правильный способ исследования сетевого трафика. Вы можете достичь этого двумя способами.

  1. Предпочтительным способом является использование Fiddler , который является инструментом веб-отладки (в основном позволяет вам проверять веб-трафик - то есть запросы и ответы). Следуйте этим инструкциям , чтобы подключить Fiddler к вашему Xbox.
  2. Вы можете просто использовать Device Portal для Xbox , и это Http Monitor

Редактировать: Диагноз

Очень трудно диагностировать проблему, с которой вы сталкиваетесь, даже не зная и не видя, что происходит. Тем не менее, я бы проверил правильность учетных данных, которые вы передаете с запросом, так как вы получаете 401, что означает

Запрос не был применен, поскольку в нем отсутствует действительная аутентификация. учетные данные для целевого ресурса.

Предполагая, что учетные данные верны, судя по тому, что вы указали, это может быть связано с заголовком Content-Type, который вы устанавливаете в запросе. Сервер может не понимать, что вы запрашиваете его форматирование ответа на text/html, но он возвращает 200 при использовании text/x-json. Попробуйте использовать последний (т.е. text/x-json) на Xbox.

ПРИМЕЧАНИЕ: Вы, вероятно, должны использовать application/json ( link ) вместо Text/x-json, так как последний неофициальный / экспериментальный

Имея Fiddler, работающий с вашим Xbox, я бы возился с этими запросами, а не перезапускал приложение когда-либо. Используйте вкладку Composer для манипулирования заголовками запроса или чем-то еще по этому вопросу.

...