HttpClient请求RESTful风格API,await client.PostAsync调用无反应

anliuty 2017-07-21 03:23:53
API服务端要求Request的content-type为application/json,响应返回数据content-type也为application/json,以下是我请求类中的代码:

private async Task checkParameterAndTokenAsync(string path, bool needAuthorization = true)
{
if (string.IsNullOrEmpty(path))
{
throw new ArgumentNullException("path");
}
if (needAuthorization && (Config.ManagerToken == null || Config.ManagerToken.IsExpired()))
{
await TokenAsync();
}
}
private HttpClient prepareRequestClient(bool isPost, bool needAuthorization = true)
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri($"{Config.base_address}/{Config.org_name}/{Config.app_name}/" );
if (isPost)
{
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
if (needAuthorization)
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("basic", $"Bearer {Config.ManagerToken.access_token}");
}
return client;
}

/// <summary>
/// 获取Token并保存
/// </summary>
/// <returns></returns>
public async Task<ManagerToken> TokenAsync()
{
var dict = new Dictionary<string, string>();
dict.Add("grant_type", "client_credentials");
dict.Add("client_id", Config.client_id);
dict.Add("client_secret", Config.client_secret);
string bodyJson = Newtonsoft.Json.JsonConvert.SerializeObject(dict);
var resultString = await PostAsync("token", false, bodyJson);
if (!string.IsNullOrEmpty(resultString))
{
var token = Newtonsoft.Json.JsonConvert.DeserializeObject<ManagerToken>(resultString);
token.timestamp = DateTime.Now.ToTimestamp();
//保存Token的IO操作,不关心本次保存是否成功,异步调用,不等待
Task task = Config.SaveTokenAsync(token);
return token;
}
return null;
}
public async Task<string> PostAsync(string path, bool needAuthorization = true, string bodyJson = null)
{
await checkParameterAndTokenAsync(path, needAuthorization);
using (HttpClient client = prepareRequestClient(true, needAuthorization))
{
try
{
var content = (!string.IsNullOrEmpty(bodyJson)) ? new StringContent(bodyJson, Encoding.Default, "application/json") : null;
var response = await client.PostAsync(path, content);
//var response = client.PostAsync(path, content).Result;
if(response.IsSuccessStatusCode)
{
return response.Content.ReadAsStringAsync().Result;
}
return string.Empty;
}
catch(Exception ex)
{
return string.Empty;
}
}
}


我在业务代码中调用

var token = request.TokenAsync().Result;


调试发现,执行到加粗标红的那句代码后,程序不再继续执行,无异常,无返回,仿佛已经执行完成一样,类似假死,但是IDE无卡顿,若将此行换成其后的注释语句,则顺利得到返回数据,请问是什么原因?
...全文
1111 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
anliuty 2017-07-21
  • 打赏
  • 举报
回复
谢谢,速度真快
正怒月神 版主 2017-07-21
  • 打赏
  • 举报
回复
async和await具有感染性。 底层用了,上层也要用,不然容易出现假死。很多文章已经讨论过这个问题了。就不赘述了,你自己查查 public async ...........(){ var token = await request.TokenAsync().Result; }

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧