C# GetAsync请求返回空内容

C# GetAsync请求返回空内容,c#,asp.net-mvc-4,xamarin,asp.net-web-api,dotnet-httpclient,C#,Asp.net Mvc 4,Xamarin,Asp.net Web Api,Dotnet Httpclient,我想知道为什么当我在postman中尝试它有数据返回时它返回null。这是我的密码 public async Task<List<HomeViewModel>> GetUserJobs(LoginResult token) { var result = new List<HomeViewModel>(); string url = "JobHeaders?userName=" + token.userName; HttpResponse

我想知道为什么当我在postman中尝试它有数据返回时它返回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;
}
反序列化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;
    }
}
私有列表GetJobResponse(HttpResponseMessage响应)
{
var result=新列表();
if(响应。IsSuccessStatusCode)
{
var jsonString=response.Content.ReadAsStringAsync();
jsonString.Wait();
if(jsonString.IsCompleted)
{
尝试
{
var data=JObject.Parse(jsonString.Result);
结果=JsonConvert.DeserializeObject(data.ToString());
result.FirstOrDefault().isSuccess=true;
result.FirstOrDefault().TotalJobs=result.Count();
result.FirstOrDefault().TotalOpenJobs=result.Where(x=>x.JobStatus==“拾取”| | x.JobStatus==“拾取”).ToList().Count();
}
捕获(例外情况除外)
{
result.FirstOrDefault().message=ex.message;
result.FirstOrDefault().isSuccess=false;
}
}
返回结果;
}
其他的
{
返回null;
}
}
下图是httpresponse,其中内容为null,状态代码为true

这是邮递员的回复


我也中断了web API,因为它只在我的本地应用程序中,所以它实际上有数据。

避免混合使用异步/Wait和阻塞调用,如
.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;
    }
}
专用异步任务GetJobResponse(HttpResponseMessage响应){
var result=新列表();
if(响应。IsSuccessStatusCode){
var jsonString=await response.Content.ReadAsStringAsync();
试一试{
结果=JsonConvert.DeserializeObject(jsonString);
if(result!=null&&result.Count>0){
result.FirstOrDefault().isSuccess=true;
result.FirstOrDefault().TotalJobs=result.Count();
result.FirstOrDefault().TotalOpenJobs=result.Where(x=>x.JobStatus==“拾取”| | x.JobStatus==“拾取”).Count();
}
}捕获(例外情况除外){
var item=新的HomeViewModel{
消息=例如消息,
isSuccess=false
};
结果.添加(项目);
}                
返回结果;
}否则{
返回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;
}
公共异步任务GetUserJobs(LoginResult令牌){ var result=新列表(); string url=“JobHeaders?userName=“+token.userName; HttpResponseMessage httpResponse=wait_requestHelper.GetHttpResponse(url,token.access_token); 结果=等待GetJobResponse(httpResponse); 返回结果; } 最后,我建议您回顾一下应该如何使用
HttpClient
。不建议为每个请求创建新实例。

您的响应确实包含内容。这是“本地人”窗口中图像的第二行。它是一个
StreamContent
对象


您看到的是请求的内容。它没有内容,因为HTTP GET请求(通常)没有正文。

这些阻塞调用会给您带来问题。让
GetJobResponse
返回任务并等待响应字符串。避免混合使用async Wait和阻塞调用,如
.Wait()
.Result
。我尝试过不使用async,而是使用相同的响应。它为空。
HttpClient
有一个异步API,旨在以非阻塞方式使用。
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;
}