33

我有这行代码

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

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

4

6 回答 6

71

继续从内容中获取:

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

但是,这确实是一种快速获得结果的幼稚方法。PostAsJsonAsync并且ReadAsAsync不是这样设计的,它们旨在支持async await编程,所以你的代码应该是:

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

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

于 2013-03-04T15:50:22.737 回答
40

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

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

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

于 2014-03-23T18:40:41.947 回答
12

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

相反,您需要通过以下方式异步执行:

    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;

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

我希望它有帮助!

于 2013-05-03T08:58:15.230 回答
3

如果您调用通用版本,它应该给您返回布尔值:

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

至少根据文档

于 2013-03-04T15:47:50.820 回答
3

我使用 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
            }
于 2013-07-16T13:47:07.797 回答
0

现在是 2021 年 7 月,我正在使用 .net 5(即 .net core 5)。

我在 System.Net.Http 中没有看到上述任何通用方法。现在代码看起来像这样(经过测试):

        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("https://localhost:44330/api/Book/Add");
            var response = client.PostAsJsonAsync(client.BaseAddress,
                JsonSerializer.Serialize(_teamSummaries));
            MessageBox.Show(@"Result is " + JsonSerializer.Serialize(response));
            var returnValue = response.Result.Content.ReadAsStringAsync();
            MessageBox.Show(@"Return value is " + returnValue.Result);
        }

还有ReadAsStringAsync、ReadAsByteArrayAsync、ReadAsStream、ReadFromJsonAsync、ReadFromJsonAsync(此方法返回Task)。

但从文字意思是“ReadFromJsonAsync”,我认为T不是上面提到的bool,而是一个包含bool成员的类。如果您想退回书籍之类的东西,请尝试一下。

另一方面,由于服务器上的代码如下所示(.net 5):

    [HttpPost]
    [Route("Add")]
    public async Task<ActionResult<IEnumerable<Book>>> Add(string value)
    {
        var all = await _dbCollection.FindAsync(Builders<Book>.Filter.Empty);
        return Ok("Everything is ok.");
    }

所以,如果我们想通过 bool 返回 true,我们应该返回 Ok(...)。如果我们想通过 bool 返回 false,我们应该返回别的东西。还有 20 多种其他类型的结果,其中包含更多信息,而不仅仅是“错误”。

于 2021-07-19T04:21:24.433 回答