【发布时间】:2016-11-08 06:22:18
【问题描述】:
我正在调用以下函数来获取访问令牌,以便使用 REST Api 检索 Twitter 用户配置文件。
public async Task<string> GetAccessToken()
{
try
{
var httpClient = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://api.twitter.com/oauth2/token ");
var customerInfo = Convert.ToBase64String(new UTF8Encoding().GetBytes(OAuthConsumerKey + ":" + OAuthConsumerSecret));
request.Headers.Add("Authorization", "Basic " + customerInfo);
request.Content = new StringContent("grant_type=client_credentials", Encoding.UTF8, "application/x-www-form-urlencoded");
//program exits at this point
HttpResponseMessage response = await httpClient.SendAsync(request).ConfigureAwait(false);
string json = await response.Content.ReadAsStringAsync();
var serializer = new JavaScriptSerializer();
dynamic item = serializer.Deserialize<object>(json);
return item["access_token"];
}
catch (Exception ex)
{
MessageBox.Show("In Retrieving access token : " + ex.ToString());
}
}
程序退出/终止,在调用HttpResponseMessage response = await httpClient.SendAsync(request).ConfigureAwait(false); 时未检索到响应。
这是调用GetAccessToken()
的父函数public async Task getUserProfile(string userName)
{
try
{
if (accessToken == null)
{
accessToken = await GetAccessToken().ConfigureAwait(false);
}
var request = new HttpRequestMessage(HttpMethod.Get, string.Format(" https://api.twitter.com/1.1/users/show.json?screen_name={0}", userName));
request.Headers.Add("Authorization", "Bearer " + accessToken);
var httpClient = new HttpClient();
HttpResponseMessage response = await httpClient.SendAsync(request).ConfigureAwait(false);
var jsonString = await response.Content.ReadAsStringAsync();
var serializer = new JavaScriptSerializer();
dynamic jsonObj = serializer.Deserialize<object>(jsonString);
}
catch (Exception ex)
{
if (DEBUG)
{
MessageBox.Show("In Retrieving user profile from twitter : " + ex.ToString());
}
}
}
我无法捕获程序为何在 GetAccessToken() 或 getUserProfile() 退出的异常。但是,如果 getUserProfile() 将 Task<IEnumerable<string>> 作为返回类型,则代码会成功执行并检索 HttpResponseMessage。为什么会出现这个问题?如何捕获异常?
【问题讨论】:
-
如你所说,你的方法是异步的......当任务将被执行/完成时会发生异常。是否需要使用异步方法?
-
你能显示调用
getUserProfile的代码吗?这是什么类型的应用程序? -
想知道你为什么在那里使用 JavaScriptSerializer?微软的documentation 上面写着“Json.NET 应该用于 [用于] 序列化和反序列化。为支持 AJAX 的应用程序提供序列化和反序列化功能。”
-
@Paulo Morgado getUserProfile() 使用函数
public void getTwitterInfo() { var twitter = new Twitter("consumerKey","consumerSecret"); twitter.getUserProfile(userName); }调用 -
所以,您不必等待它完成。它是控制台应用程序吗?
标签: c# asynchronous async-await httpclient