C#UWP Windows.Web.Http.HttpClient Xbox上的错误401

时间:2018-05-14 08:07:53

标签: c# uwp xbox

问题

Xbox One 上使用Windows.Web.Http.HttpClient时,我遇到了一个奇怪的 401 Unauthorized Error 。在 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输出(我有硬编码用户名/传递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

视窗:

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。

Strange Thing现在是,我在fiddler中得到了这样的结果:

视窗:

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 无法进行连接!所以我认为使用 Windows.Security.Credentials.PasswordCredential 在Xbox上生成摘要有问题吗?

说清楚:

  • 服务器身份验证基本:

    • Windows 确定
    • Xbox 确定
  • 服务器身份验证摘要:

    • Windows 确定
    • Xbox FAILED
  • 服务器身份验证摘要+基本:

    • Windows 确定(使用摘要进行身份验证)
    • Xbox 确定(使用基本身份验证进行身份验证)

1 个答案:

答案 0 :(得分:0)

如果我是你,我肯定会做@janniks在评论中提出的建议 - 检查你所获得的Exception

更重要的是,至少在这种情况下,您应该有一个正确的方法来调查您的网络流量。你可以通过两种方式实现这一目标。

  1. 首选方法是使用Fiddler,这是一个Web调试工具(基本上允许您检查网络流量 - 即请求和响应)。按照these instructions将Fiddler与您的Xbox连接起来。
  2. 您可以使用Device Portal for Xbox并使用Http Monitor
  3. 编辑: 诊断

    如果不真正了解并了解正在发生的事情,很难确定您面临的问题是什么。不过,我会检查你通过请求传递的凭据是否正确,因为你得到401,这意味着

      

    请求尚未应用,因为它缺少有效的身份验证   目标资源的凭据。

    假设凭据是正确的,根据您提供的内容,可能与您在请求中设置的Content-Type标头有关。服务器可能不理解您要求它将其响应格式化为text/html,但在使用text/x-json时它会返回200。尝试在Xbox上使用后者(即text/x-json)。

    注意:您应该使用application/jsonlink)代替Text/x-json,后者is unofficial/experimental

    让Fiddler使用你的Xbox,我会在其中摆弄这些请求,而不是一直重新运行应用程序。使用Composer标签来操纵请求标头或其他任何内容。