从PostAsJsonAsync获取响应

我有这行代码

var response = new HttpClient().PostAsJsonAsync(posturi, model).Result; 

被调用的WebAPI控制器返回一个bool以确保该对象已保存,但如何返回该bool响应?

继续从内容获取:

 var httpClient = new HttpClient(); var response = httpClient.PostAsJsonAsync(posturi, model).Result; bool returnValue = response.Content.ReadAsAsync().Result; 

但是,这是一种非常天真的方法,可以快速获得结果。 PostAsJsonAsyncReadAsAsync不是这样设计的,它们旨在支持async await编程,所以你的代码应该是:

 var httpClient = new HttpClient(); var response = await httpClient.PostAsJsonAsync(posturi, model); bool returnValue = await response.Content.ReadAsAsync(); 

此外,您应该通过返回200 OK来确定保存是否成功,而不是使用标志来检查对象是否已保存。

接受的答案在技术上是正确的,但在调用.Result阻止当前线程。 如果您使用的是.NET 4.5或更高版本,则几乎在所有情况下都应该避免使用它。 相反,使用等效的异步(非阻塞)版本:

 var httpClient = new HttpClient(); var response = await httpClient.PostAsJsonAsync(posturi, model); bool returnValue = await response.Content.ReadAsAsync(); 

请注意,包含上述代码的方法需要标记为async ,并且本身应await编辑。

由于它的异步操作不会立即执行.Result是错误的

相反,你需要通过这样做来实现异步:

var httpClient = new HttpClient()

  var task = httpClient.PostAsJsonAsync(posturi, model) .ContinueWith( x => x.Result.Content.ReadAsAsync().Result); // 1. GETTING RESPONSE - NOT ASYNC WAY task.Wait(); //THIS WILL HOLD THE THREAD AND IT WON'T BE ASYNC ANYMORE! bool response = task.Result // 2. GETTING RESPONSE - TASK ASYNC WAY (usually used in < .NET 4.5 task.ContinueWith( x => { bool response = x.Result }); // 3. GETTING RESPONSE - TASK ASYNC WAY (usually used in >= .NET 4.5 bool response = await task; 

注意:我刚刚在这里写了它们,所以我没有实际测试它们,但或多或​​少是你想要的。

我希望它有所帮助!

如果你调用通用版本,它应该给你回到bool:

 var response = new HttpClient().PostAsJsonAsync(posturi, model).Result; 

至少根据文档 。

我使用HttpStatusCode来检查结果。

  public HttpStatusCode PostStaffPositions(Foo foo) { string uri = myapiuri; using (HttpClient httpClient = new HttpClient()) { var response = httpClient.PostAsJsonAsync(uri, foo).Result; return response.StatusCode; } } 

然后在Controller中检查它像这样:

  HttpStatusCode update = staffrest.PostStaffPositions(foo); if (update == HttpStatusCode.OK) { //Update Succeed } else { //Update Failed }