从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;
但是,这是一种非常天真的方法,可以快速获得结果。 PostAsJsonAsync
和ReadAsAsync
不是这样设计的,它们旨在支持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 }
- 更改Google云端硬盘中的重定向url – C#(第2部分)
- 使用MS Bundling清空捆绑包
- Autofac属性注入在属性上失败
- 使用mvc4设置现有成员资格
- 运行时错误:无法加载文件或程序集’System.Web.WebPages.Razor,Version = 3.0.0.0
- 如何使用.Net 4.0中包含的HttpClient类将文件上传到IIS Express中运行的Asp.Net MVC 4.0操作
- MVC4将模型绑定到ICollection或List in partial
- 如果我希望使用ASP.NET MVC4创建ApiKey受限资源,我应该使用IAuthorizationFilter吗?
- Linq加入iquery,如何使用defaultifempty