首页 > 解决方案 > 准备控制器和http请求以处理请求而不返回值

问题描述

我有以下方法来收集汽车:

public async Task<IEnumerable<Car>> GetCars(object car, CancellationToken ct)
{
      var uri = new Uri($"{_webApiUrl}Car/GetCars");
      using (var httpClient = new HttpClient())
      {
          HttpContent content = new StringContent(JsonConvert.SerializeObject(car), Encoding.UTF8, "application/json");
          var req = await httpClient.PostAsync(uri, content, ct);
          var response = await req.Content.ReadAsStringAsync();
          return JsonConvert.DeserializeObject<IEnumerable<Car>>(response);
       }
}

在我的控制器中的服务 api 中,我有这个来获取它:

[HttpPost]
[Route("api/[controller]/[action]")]
public IActionResult GetBottleTypeById(Car car)
{
     return Ok(_carQuery.GetCars(car));
}

这两件事都很好 - 没有问题。

现在我需要保存Car并且我不需要返回一些东西(最终我可以返回真或假,无论它是否成功)。问题是我不确定controller's method应该是什么样子,如果我这样做,它会说:not all code path returns value:

[HttpPost]
[Route("api/[controller]/[action]")]
public IActionResult UpdateOperation(Car car)
{
      _carRepository.UpdateOperation(car) //UpdateOperation is void with try/catch - throw;
}

同样的事情request,这应该如何完成?

public async Task UpdateCar(Car selectedCar, CancellationToken ct)
{
       var uri = new Uri($"{_webApiUrl}Car/UpdateOperation");
       using (var httpClient = new HttpClient())
       {
           HttpContent content = new StringContent(JsonConvert.SerializeObject(selectedCar), Encoding.UTF8, "application/json");
           var req = await httpClient.PostAsync(uri, content, ct);
           var response = await req.Content.ReadAsStringAsync();
           return JsonConvert.DeserializeObject<IEnumerable<Car>>(response);
       }
}

我怎样才能准备好这两件事才能让它发挥作用?

标签: c#asp.net-core-webapi

解决方案


只需将您的代码更改为 return void。ASP.NET 足够聪明,只要200 OK没有从 void 方法抛出异常就发送。

[HttpPost]
[Route("api/[controller]/[action]")]
public void UpdateOperation(Car car)
{
      _carRepository.UpdateOperation(car) //UpdateOperation is void with try/catch - throw;
}

要使您的调用代码正常工作,您不需要从服务器接收 HTTP 响应消息以外的任何内容。即使您的方法返回void,HTTP 服务器仍会发送状态代码(200、500 等)和一些标头供您检查。

尝试这个:

public async Task UpdateCar(Car selectedCar, CancellationToken ct)
{
       var uri = new Uri($"{_webApiUrl}Car/UpdateOperation");
       using (var httpClient = new HttpClient())
       {
           HttpContent content = new StringContent(JsonConvert.SerializeObject(selectedCar), Encoding.UTF8, "application/json");
           var response = await httpClient.PostAsync(uri, content, ct);
           if (response.IsSuccessStatusCode)
           {
               return;
           }
           else
           {
               // handle error
           }
       }
}

推荐阅读