【发布时间】:2014-08-18 17:01:57
【问题描述】:
我在 Visual Studio 中创建了一个 PCL,目标是:.NET 4.5、Windows Phone 8、Windows Store Apps、Xamarin Android 和 Xamarin iOS。
此 PCL 通过 HttpClient 请求与 YouTube Data API v3 集成(直接使用客户端库时存在一些问题)。
我已经编写并成功运行了在 Visual Studio 中测试此集成的单元测试(引用 PCL 项目的测试项目),但是,当我在 Xamarin Android 项目(在 Xamarin Studio 中)中使用这些方法时,我收到了 Forbidden 403 错误在 GET 方法之一(search.list - GetStringAsync 下面)上,POST 方法似乎工作正常。
有问题的方法如下:-
public async Task<Google.Apis.YouTube.v3.Data.SearchListResponse> GetVideosForChannelManual(string channelId, string apiKey, string pageToken)
{
var requestString = "https://www.googleapis.com/youtube/v3/search?part=snippet&maxResults=50";
requestString += "&channelId=" + channelId;
requestString += "&key=" + apiKey;
if (!String.IsNullOrEmpty(pageToken))
{
requestString += "&pageToken=" + pageToken;
}
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var task = await client.GetStringAsync(requestString);
var deserializedResponse = JsonConvert.DeserializeObject<Google.Apis.YouTube.v3.Data.SearchListResponse>(task);
return deserializedResponse;
}
}
异常详情如下:-
[0] {System.Net.Http.HttpRequestException: 403 (Forbidden)
at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode () [0x00000] in <filename unknown>:0
at System.Net.Http.HttpClient+<GetStringAsync>c__async5.MoveNext () [0x00000] in <filename unknown>:0
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x00000] in <filename unknown>:0
at System.Runtime.CompilerServices.TaskAwaiter`1[System.String].GetResult () [0x00000] in <filename unknown>:0
at YouTubeHelpers.YouTubeRepository+<GetVideosForChannelManual>d__27.MoveNext () [0x000fa] in c:\...\YouTubeRepository.cs:187
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x00000] in <filename unknown>:0
at System.Runtime.CompilerServices.TaskAwaiter`1[Google.Apis.YouTube.v3.Data.SearchListResponse].GetResult () [0x00000] in <filename unknown>:0
at YouTubeHelpers.YouTubeRepository+<GetAllVideosForChannelManual>d__20.MoveNext () [0x00061] in c:\..\YouTubeRepository.cs:160 } System.Net.Http.HttpRequestException
我最初的想法是,在 Android 上运行 Http 请求标头与直接在 VS 中运行时不同,因此尝试在 Fiddler 中使用模拟器上的反向代理进行比较(问题存在于模拟器和硬件设备上),但是我无法让应用程序通过代理发送网络流量(即使浏览器流量已正确发送到提琴手)。
可能必须为此代理设置 HttpClient 处理程序,但由于对 PCL 中 System.Net 库的访问受限,不清楚如何实现这一点。
我是否应该为这些 GET 请求另外设置一些东西,请记住,在我明确发送 OAuth2 令牌作为身份验证标头(必需)的 POST 请求(例如插入,插入订阅)中工作正常吗?
任何建议将不胜感激。
更新
尝试使用 ModernHttpClient,但异常仍然存在。仍然觉得这与请求标头有关,但目前还没有确凿证据。
【问题讨论】:
-
从 NuGet 尝试 ModernHttpClient。它是原生客户端之上的跨平台层,它使用 System.Net.Http(与 HttpClient 完全兼容)
-
@xakz 感谢您的评论。我确实考虑了 ModernHttpClient,但认为首先理解这里的潜在问题是值得的。假设我可以将 NuGet 包添加到 PCL,我会试一试,看看它是否能解决问题。
-
@xakz 我已经尝试了 ModernHttpClient 的请求,但遗憾的是看到了同样的异常。正如宣传的那样,虽然通话可能会更快一些,所以我可能会继续使用它。我可能不得不尝试一些其他 GET 请求作为比较,因为它与我的 POST 请求没有问题,可能是由于传递了身份验证令牌。再次感谢。
标签: c# android .net youtube-api xamarin