2

我正在使用具有以下定义的服务:

[HttpGet]
[SwaggerOperation(nameof(GetAnimal))]
[Route("{animalId:long}", Name = nameof(GetAnimal))]
[ProducesResponseType(typeof(AnimalModel), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ErrorModel), StatusCodes.Status500InternalServerError)]
public Task<IActionResult> GetAnimal(string tenantId, long animalId)
{
    try
    {
        // Find the actual animal.. somewhere.

        return Ok(new AnimalModel());      

    }
    catch (Exception exception)
    {
        return InternalServerError(new ErrorModel());
    }    
}

这似乎会导致autorest生成一个object返回类型为 a 的 C# 客户端(我猜是因为该ProducesResponseType属性被指定了两次):

public async Task<HttpOperationResponse<object>> GetAnimalWithHttpMessagesAsync(string tenantId, long animalId, [..])

问题

处理返回不同对象的 API 的推荐方法是什么?

潜在的解决方案

  • 我可以修复客户端代码并转换结果以找到正确的类型(不好)。
  • 我可以修改 API(如果可能的话),使它只返回一个由 theAnimalModel和 the组成的对象ErrorModel(可能会更好)。
4

1 回答 1

0

ActionResult<T>

ASP.NET Core 2.1 引入了ActionResult<T>Web API 控制器操作的返回类型。它使您能够返回派生自ActionResult或返回特定类型的类型。ActionResult<T>提供以下IActionResult类型的好处:

  • 可以排除[ProducesResponseType]属性的属性。Type例如,[ProducesResponseType(200, Type = typeof(Product))]简化为[ProducesResponseType(200)]T操作的预期返回类型是从in推断出来的ActionResult<T>
  • 隐式转换运算符支持将T和转换ActionResultActionResult<T>T转换为ObjectResult,这意味着return new ObjectResult(T);简化为return T;

考虑使用新的ActionResult<T>并完全删除产生响应属性 Type

[HttpGet]
[SwaggerOperation(nameof(GetAnimal))]
[Route("{animalId:long}", Name = nameof(GetAnimal))]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<ActionResult<AnimalModel>> GetAnimal(string tenantId, long animalId) {
    try {
        // Find the actual animal.. somewhere...using await.

        var model = new AnimalModel();

        //populate model    

        return model;
    } catch (Exception exception) {
        return InternalServerError(new ErrorModel());
    }
}
于 2018-08-01T15:54:05.287 回答