从PostAsJsonAsync获取响应

Kai*_*per 22 c# asp.net-mvc-4 asp.net-web-api

我有这行代码

var response = new HttpClient().PostAsJsonAsync(posturi, model).Result;
Run Code Online (Sandbox Code Playgroud)

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

cuo*_*gle 50

继续从内容获取:

var httpClient = new HttpClient();
var response = httpClient.PostAsJsonAsync(posturi, model).Result;
bool returnValue = response.Content.ReadAsAsync<bool>().Result;
Run Code Online (Sandbox Code Playgroud)

但是,这是一种非常天真的方法,可以快速获得结果.PostAsJsonAsync并且ReadAsAsync不是为此而设计的,它们旨在支持async await编程,因此您的代码应该是:

var httpClient = new HttpClient();
var response = await httpClient.PostAsJsonAsync(posturi, model);
bool returnValue = await response.Content.ReadAsAsync<bool>();
Run Code Online (Sandbox Code Playgroud)

此外,您应该使用HTTP代码返回200 OK以确定保存是否成功,而不是使用标志来检查对象是否已保存.

  • 为什么`.Result`和阻塞而不是'等待'? (2认同)

Tod*_*ier 33

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

var httpClient = new HttpClient();
var response = await httpClient.PostAsJsonAsync(posturi, model);
bool returnValue = await response.Content.ReadAsAsync<bool>();
Run Code Online (Sandbox Code Playgroud)

请注意,需要标记包含上述代码的方法async,并且应该对其进行await编辑.


Ste*_*ier 10

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

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

var httpClient = new HttpClient()

    var httpClient = new HttpClient()

    var task = httpClient.PostAsJsonAsync(posturi, model)
                         .ContinueWith( x => x.Result.Content.ReadAsAsync<bool>().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;
Run Code Online (Sandbox Code Playgroud)

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

我希望它有所帮助!

  • 我建议不要将 httpClient 包装在 using 语句中 - https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ (3认同)