GetAsync 请求返回空内容
Posted
技术标签:
【中文标题】GetAsync 请求返回空内容【英文标题】:GetAsync request returns null content 【发布时间】:2018-03-13 01:49:19 【问题描述】:我想知道为什么当我在邮递员中尝试它有数据返回时它返回 null。这是我的代码。
public async Task<List<HomeViewModel>> GetUserJobs(LoginResult token)
var result = new List<HomeViewModel>();
string url = "JobHeaders?userName=" + token.userName;
HttpResponseMessage httpResponse = await _requestHelper.GetHttpResponse(url, token.access_token);
result = GetJobResponse(httpResponse);
return result;
获取异步函数
public async Task<HttpResponseMessage> GetHttpResponse(string requestUri, string token)
using (var client = CreateHttpClient(token))
try
HttpResponseMessage response = await client.GetAsync(requestUri);
return response;
catch (HttpRequestException ex)
throw new HttpRequestException(ex.Message);
添加基地址
private HttpClient CreateHttpClient(string authorization="")
var client = new HttpClient();
string baseAddress = WebApiBaseAddress;
if (string.IsNullOrEmpty(baseAddress))
throw new HttpRequestException("There is no base address specified in the configuration file.");
client.Timeout = new TimeSpan(0, 5, 59);
client.BaseAddress = new Uri(baseAddress);
//client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Add("Authorization", string.Format("bearer 0", authorization));
client.DefaultRequestHeaders.Add("Accept", "application/json");
client.DefaultRequestHeaders.Add("LegacyUse", "true");
return client;
反序列化 JSON
private List<HomeViewModel> GetJobResponse(HttpResponseMessage response)
var result = new List<HomeViewModel>();
if (response.IsSuccessStatusCode)
var jsonString = response.Content.ReadAsStringAsync();
jsonString.Wait();
if (jsonString.IsCompleted)
try
var data = JObject.Parse(jsonString.Result);
result = JsonConvert.DeserializeObject<List<HomeViewModel>>(data.ToString());
result.FirstOrDefault().isSuccess = true;
result.FirstOrDefault().TotalJobs = result.Count();
result.FirstOrDefault().TotalOpenJobs = result.Where(x => x.JobStatus == "Picked_Up" || x.JobStatus == "Picked Up").ToList().Count();
catch (Exception ex)
result.FirstOrDefault().message = ex.Message;
result.FirstOrDefault().isSuccess = false;
return result;
else
return null;
下图是httpresponse,内容为null,状态码为true
这是邮递员的回复
我也对 Web API 进行了断点,因为它只在我的本地,然后它实际上有数据。
【问题讨论】:
那些阻塞调用会给你带来麻烦。有GetJobResponse
返回任务并等待响应字符串。避免混合使用异步等待和阻塞调用,例如 .Wait()
或 .Result
。
我试过不使用异步但相同的响应。它是空的。
【参考方案1】:
避免混合使用 async/await 和阻塞调用,例如 .Wait()
或 .Result
重构您的代码,使其始终保持异步
private async Task<List<HomeViewModel>> GetJobResponse(HttpResponseMessage response)
var result = new List<HomeViewModel>();
if (response.IsSuccessStatusCode)
var jsonString = await response.Content.ReadAsStringAsync();
try
result = JsonConvert.DeserializeObject<List<HomeViewModel>>(jsonString);
if(result != null && result.Count > 0)
result.FirstOrDefault().isSuccess = true;
result.FirstOrDefault().TotalJobs = result.Count();
result.FirstOrDefault().TotalOpenJobs = result.Where(x => x.JobStatus == "Picked_Up" || x.JobStatus == "Picked Up").Count();
catch (Exception ex)
var item = new HomeViewModel
message = ex.Message,
isSuccess = false
;
result.Add(item);
return result;
else
return null;
用过
public async Task<List<HomeViewModel>> GetUserJobs(LoginResult token)
var result = new List<HomeViewModel>();
string url = "JobHeaders?userName=" + token.userName;
HttpResponseMessage httpResponse = await _requestHelper.GetHttpResponse(url, token.access_token);
result = await GetJobResponse(httpResponse);
return result;
最后我建议你回顾一下HttpClient
应该如何使用。不建议为每个请求创建一个新实例。
【讨论】:
HttpClient
具有异步 API,旨在以非阻塞方式使用。【参考方案2】:
您的回复确实有内容。这是 Locals 窗口中图像中的第二行。这是一个StreamContent
对象。
您正在查看的是您的请求的内容。这没有内容,因为 HTTP GET 请求没有正文(通常)。
【讨论】:
以上是关于GetAsync 请求返回空内容的主要内容,如果未能解决你的问题,请参考以下文章
在 Mac 上从 Visual Studio 调用 URL。 GetAsync 永远不会返回