【问题标题】:C# UWP Windows.Web.Http.HttpClient Error 401 on XboxXbox 上的 C# UWP Windows.Web.Http.HttpClient 错误 401
【发布时间】:2018-05-18 15:13:43
【问题描述】:

问题

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 输出(我有 硬编码 用户名/密码以避免任何输入错误)。

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。

现在奇怪的是,我在 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 上似乎有一个大问题。我玩弄了网络服务器。如果我在服务器上将身份验证设置为 digest only,则 Xbox 无法 连接!所以我认为使用 Windows.Security.Credentials.PasswordCredential 在 Xbox 上生成摘要有问题吗?

说清楚:

  • 服务器认证基础:

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

    • Windows 确定
    • Xbox 失败
  • 服务器认证摘要+基本:

    • Windows 确定(已通过摘要验证)
    • Xbox OK(通过基本身份验证)

【问题讨论】:

  • 而不是catching 所有异常而不记录任何内容。通过调试/断点或将异常的内容记录到控制台,至少尝试catch (Exception e) 并检查e 元素。 您可以在以下位置找到有关异常及其属性的信息: C# Exception Properties

标签: c# uwp xbox


【解决方案1】:

如果我是你,我肯定会按照@janniks 在他的评论中建议的去做 - 检查你得到的 Exception

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

  1. 首选方法是使用Fiddler,它是一个 Web 调试工具(基本上允许您检查 Web 流量 - 即请求和响应)。关注these instructions,将 Fiddler 与您的 Xbox 连接起来。
  2. 您可以使用Device Portal for Xbox,它是Http Monitor

编辑:诊断

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

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

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

注意:您可能应该使用application/json (link) 而不是Text/x-json,因为后者是is unofficial/experimental

让 Fiddler 在您的 Xbox 上工作,我会在其中摆弄这些请求,而不是每次都重新运行应用程序。使用Composer 选项卡来操作请求标头或其他任何内容。

【讨论】:

  • 是的,上面的代码只是一个例子。通常我会抓住所有的例外。我尝试使用 Fiddler 进行调试,这在我的 Windows 机器上运行良好。不知道我可以在我的 Xbox 上使用它。到目前为止,感谢您提供的链接,稍后我会返回 fiddler 的一些结果。
  • 编辑了我的答案:)
  • 添加了我的解决方案,但我的问题是为什么 filter.ServerCredential 在 Xbox One 上不起作用...
  • 在设置ServerCredential 时,我找不到任何有关如何格式化请求的信息。我只能假设它不起作用,因为 Request 没有按照服务器期望的方式格式化。
  • 更新了我的参赛帖,我真的觉得 Xbox One 上的ServerCredential 有问题...
猜你喜欢
  • 2016-04-02
  • 2022-12-18
  • 2016-06-27
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 2018-07-15
相关资源
最近更新 更多