Sre*_*ree 7 c# asynchronous httpclient async-await
我正在调用以下函数来获取访问令牌以使用 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());
}
}
Run Code Online (Sandbox Code Playgroud)
程序退出/终止而不在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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
我无法捕捉到程序为何在 GetAccessToken() 或 getUserProfile() 处退出的异常。但是,如果 getUserProfile() 具有Task<IEnumerable<string>>作为返回类型,则代码会成功执行并检索 HttpResponseMessage 。为什么会出现这个问题?如何捕获异常?
您的申请会永久退出,因为您没有等待getUserProfile()完成。您可以getTwitterInfo与其他任务类似地标记为异步,或者告诉它等待任务完成
public async Task getTwitterInfo() {
var twitter = new Twitter("consumerKey","consumerSecret");
await twitter.getUserProfile(userName);
}
Run Code Online (Sandbox Code Playgroud)
或者
public void getTwitterInfo() {
var twitter = new Twitter("consumerKey","consumerSecret");
var task = twitter.getUserProfile(userName);
var result = task.WaitAndUnwrapException();
}
Run Code Online (Sandbox Code Playgroud)
小智 1
你有没有尝试过
HttpResponseMessage response = httpClient.SendAsync(request).Result;
Run Code Online (Sandbox Code Playgroud)
我在自己的代码中也有同样的问题,这似乎已经解决了它,应该相当于原来的调用。但我仍然不明白崩溃的根本原因。
| 归档时间: |
|
| 查看次数: |
4719 次 |
| 最近记录: |