如何获取HttpClient调用响应的内容

时间:2017-12-13 15:18:53

标签: c# dotnet-httpclient

  public WorkItem CreateWorkItem(string title, string description, string comments)
    {
        HttpClient client = new HttpClient();
        //var response = client.PostAsync("http://localhost:57765/API.svc/CreateWorkItem?title="+title+"&description="+description+"&history="+comments, null).Result.Content;
        //var task = await client.PostAsync("http://localhost:57765/API.svc/CreateWorkItem?title=" + title + "&description=" + description + "&history=" + comments, null);
        var response = client.PostAsync("http://localhost:57765/API.svc/CreateWorkItem?title=" +title+"&description="+description+"&history="+ comments, null).Result;
        var result = response.Content.ReadAsStringAsync().Result;
        var workItem = JsonConvert.DeserializeObject<WorkItem>(result);
        return workItem;
    }

enter image description here 问题是:阅读我对API调用的响应,

使用“内容”时我也会收到错误任务不包含“内容”的定义,并且没有扩展方法“内容”接受“内容”任务类型的第一个参数可以找到

目标是使用ajax命中此方法以触发api调用并使用数据填充我的WorkItem并在调用完成后读取该响应。

 public class WorkItem
{
    public string title { get; set; }
    public string description { get; set; }
    public string status { get; set; }
    public string comments { get; set; }
}

2 个答案:

答案 0 :(得分:1)

您发现它是“发布异步”,这意味着它会返回Task<HttpWebResponse>,因此您必须await它或阻止它直到您获得结果(.Result

var response = client.PostAsync("http://localhost:57765/API.svc/CreateWorkItem?title="+title+"&description="+description+"&history="+comments, null).Result;

var response = await client.PostAsync("http://localhost:57765/API.svc/CreateWorkItem?title="+title+"&description="+description+"&history="+comments, null);

然后使用NewstonSoft.Json

var workItem = JsonConvert.Deserialize<WorkItem>(contents);

答案 1 :(得分:0)

Use shared runtime

是一个异步方法,它只返回任务而不是结果。如果要获得结果,则需要等待API的响应。 使用

client.PostAsync()

这是我们访问数据的方式。但要实现这一点,您的方法应标记为“异步”,然后只有您可以使用'await'关键字。另一种方法是,

var response = await client.PostAsync("http://localhost:57765/API.svc/CreateWorkItem?title="+title+"&description="+description+"&history="+comments, null)
var workItem = JsonConvert.Deserialize<WorkItem>(response.Content);

但是在等待方法上使用结果并不是一个好习惯。因为我们无法利用该特征的异步性。

否则,

var response = client.PostAsync("http://localhost:57765/API.svc/CreateWorkItem").Result.Content
var workItem = JsonConvert.Deserialize<WorkItem>(response);

这也不是一个好方法。如果您不使用“异步”功能,这些都是您的选择。

var task = client.PostAsync("http://localhost:57765/API.svc/CreateWorkItem");
task.wait();
var workItem = JsonConvert.Deserialize<WorkItem>(task.Result.Content);