我正在使用具有以下定义的服务:
[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
作为返回类型的C#客户端(我猜是因为ProducesResponseType
属性被指定了两次):
public async Task<HttpOperationResponse<object>> GetAnimalWithHttpMessagesAsync(string tenantId, long animalId, [..])
问题
处理返回不同对象的API的推荐方法是什么?
潜在的解决方案
AnimalModel
和ErrorModel
组成的对象(可能更好)。答案 0 :(得分:0)
ASP.NET Core 2.1为Web API控制器操作引入了
ActionResult<T>
返回类型。它使您可以返回源自ActionResult
的类型或返回特定类型。与ActionResult<T>
类型相比,IActionResult
具有以下优点:
- 可以排除
[ProducesResponseType]
属性的Type
属性。例如,[ProducesResponseType(200, Type = typeof(Product))]
简化为[ProducesResponseType(200)]
。取而代之的是从T
中的ActionResult<T>
推断出操作的预期返回类型。- 隐式强制转换运算符支持将
T
和ActionResult
都转换为ActionResult<T>
。T
转换为ObjectResult
,这意味着return new ObjectResult(T);
简化为return T;
。
考虑使用新的ActionResult<T>
并删除Produces响应属性
完全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());
}
}