从 WebApi 自定义方法返回 BadRequest

use*_*677 1 c# asp.net-core asp.net-core-webapi

在这里使用 .net core web api。

我的 api 中有一个端点:

[HttpPost("data")]
public async Task<IActionResult> PostData(List<string> udata)
{
 JArray sets = new JArray();
 try
 {
    sets = Helper.GetData(udata);

 }
 catch (Exception e)
 {
   return StatusCode(500, e.Message);
 }
}
Run Code Online (Sandbox Code Playgroud)

在上面,我在我的助手“GetData”中调用一个自定义方法,它完成所有的处理和计算。为了使 Api 控制器干净,我将所有处理移至此辅助方法。

下面是我的助手类:

public static class Helper
{
    public static BadRequestObjectResult GetMessage(string message)
    {
       return new BadRequestObjectResult(message);
    }

  public static JArray GetData(List<string> udata)
  {
      if(udata == null)
         return  GetMessage("Data is null");

      //do some processing and calclulations here
      //return BadRequest if some issue

   }
 } 
Run Code Online (Sandbox Code Playgroud)

如果存在一些处理问题或某些数据不符合预期或其他一些问题,我想抛出 BadRequest。为此,我创建了一个自定义方法来执行“BadRequestObjectResult”。

现在我的问题是,如果 GetData 中存在问题,它不会返回到我的 api 或退出我的循环。它只是继续下一个语句。

我知道通过我返回这个的方式存在一些问题,但无法找到问题。

任何人都可以指出处理这个问题的正确方法吗?

小智 5

我的建议是从您的 Helper 类中抛出一个异常,并从您的 PostData 方法中处理它。例如...

您可以抛出 ArgumentException 并从您的 API 方法中明确捕获它。

public static class Helper
{

  public static JArray GetData(List<string> udata)
  {
      if(udata == null)
         throw new ArgumentException("Data is null");

      //do some processing and calclulations here
      //throw ArgumentException if there is an issue

   }
 } 

[HttpPost("data")]
public async Task<IActionResult> PostData(List<string> udata)
{
 JArray sets = new JArray();
 try
 {
    sets = Helper.GetData(udata);
    return Ok(sets);
 }
 catch (ArgumentException e)
 {
   return BadRequest(e.Message);
 }
}
Run Code Online (Sandbox Code Playgroud)

这样你就可以只关心控制器的返回代码,而你的 Helper 方法只关心输入,而不是返回一些专门用于控制器的东西。如果您想在其他地方使用 Helper 类,那么这种方式会更灵活一些。

这也将满足您在遇到错误结果时停止处理的要求,因此一旦遇到错误结果,结果集就会被丢弃并发出 BadRequest 响应。