在 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上生成摘要有问题吗?
说清楚:
服务器身份验证基本:
服务器身份验证摘要:
服务器身份验证摘要+基本:
答案 0 :(得分:0)
如果我是你,我肯定会做@janniks在评论中提出的建议 - 检查你所获得的Exception
。
更重要的是,至少在这种情况下,您应该有一个正确的方法来调查您的网络流量。你可以通过两种方式实现这一目标。
编辑: 诊断
如果不真正了解并了解正在发生的事情,很难确定您面临的问题是什么。不过,我会检查你通过请求传递的凭据是否正确,因为你得到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标签来操纵请求标头或其他任何内容。