如何在ASP.NET Core中返回自定义HTTP状态/消息而不返回对象,IActionResult等?

时间:2016-11-23 21:48:32

标签: c# asp.net-web-api asp.net-core swagger

我有一个ASP.NET Core Web API站点,启用了Swagger生成和UI。为了使Swagger工作(至少自动工作),必须输入控制器方法的返回值。例如,

public async Task<Employee> LoadEmployee(string id)

但是,我需要从此操作返回自定义HTTP状态代码和内容。我见过的所有示例都使用StatusCode方法,或返回其他一些对象。这个问题就是Swagger不知道动作的返回类型是什么,因此无法生成API规范。

在保留签名的同时,是否有某种方法(异常,控制器上的方法等)返回自定义代码/内容?我已经看过使用自定义中间件的解决方案,但它似乎是一个常见的场景,应该有一些东西构建它。

3 个答案:

答案 0 :(得分:4)

您可以使用StatusCodeResult StatusCode(...)返回状态代码和消息/对象。

public async Task<ObjectResult> LoadEmployee(string id)
{
    var employee = await repository.GetById(id);
    if(employee == null) {
        return NotFound();
    }

    return StatusCode((int)HttpStatusCode.Ok, employee);
}

答案 1 :(得分:3)

参考:

ASP.NET Core APIs in the fast lane with Swagger and Autorest

Adding swagger in ASP.NET Core Web API

ASP.NET Core 1.0 MVC API documentation using Swashbuckle Swagger

  

对于输出定义,只需添加   描述类型的[Produces][SwaggerResponse]属性   像这样回来了:

[HttpGet]
[Produces(typeof(Employee))]
[SwaggerResponse(System.Net.HttpStatusCode.OK, Type = typeof(Employee))]
public async Task<IActionResult> LoadEmployee(string id) {
    var employee = await repository.GetById(id);
    if(employee == null) {
        return NotFound();
    }
    return Ok(employee);
}

答案 2 :(得分:1)

Swagger支持

ProducesResponseType属性,它是MVC Web API Core属性,而不是Swagger。与SwaggerResponse相同。