HttpClient请求RESTful风格API,await client.PostAsync调用无反应
API服务端要求Request的content-type为application/json,响应返回数据content-type也为application/json,以下是我请求类中的代码:
我在业务代码中调用
调试发现,执行到加粗标红的那句代码后,程序不再继续执行,无异常,无返回,仿佛已经执行完成一样,类似假死,但是IDE无卡顿,若将此行换成其后的注释语句,则顺利得到返回数据,请问是什么原因?
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无卡顿,若将此行换成其后的注释语句,则顺利得到返回数据,请问是什么原因?
...全文
相关推荐
如何在WPF应用程序中通过HttpClient调用Web API
本教程是继使用HttpClient调用Web API只有的补充教程,主要讲解了如何在WPF中异步调用Web API且不阻塞主线程。
通过HttpClient 调用ASP.NET Web API示例
本篇文章主要介绍了通过HttpClient 调用ASP.NET Web API示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
c# 服务端调用RestFul Service的方法
该文档说明c#端如何创建和调用RestFul接口,并给出详细的代码说明,方便用户学习和深入掌握。
.net 后台Post,get方式调用webapi
.net 后台Post,get方式调用webapi,包括上传文件
使用.NET Client调用Web API
除了可以在网站中使用外,Web API更广阔的应用于各种客户端开发和移动应用开发,例如Windows的桌面小工具、Windows Phone的联系人应用等。如何在这些应用中调用Web API,甚至比在网页中调用更加重要。 本教程演示了如何用C#调用Web API,至于其他编程语言——例如Java——都有相应的访问网络资源的库。


