我正在尝试找出一种方法来在我的响应中返回一个对象,同时仍然保持可理解的返回类型。
所以对于初学者来说,我知道这会按预期工作。
public async Task<HttpResponseMessage> DoMyThing(MyObject myObject)
{
var result = await _myService.CreateMyThingAsync(myObject);
return Request.CreateResponse(HttpStatusCode.Created, result);
}
但我真正想要的是这个伪代码能够工作......以某种方式。
public Task<MyObject> DoMyThing(MyObject myObject)
{
var result = _myService.CreateMyThingAsync(myObject);
return Request.CreateResponse<Task<MyObject>>(HttpStatusCode.Created, result);
// or better yet
return Request.CreateResponse<MyObject>(HttpStatusCode.Created, result);
}
框架中是否有任何魔法可以实现这一点?或者是否有任何第三方库可以执行此操作?
基本上我需要返回 Task<MyObject>而不是 Task<HttpResponseMessage>
我也愿意接受有关如何在返回 Task<MyObject> 的同时返回非 200 响应的其他建议。
请您参考如下方法:
将类型指定为返回类型的问题在于您限制自己必须返回该类型。这听起来可能很奇怪,但实际上会有很多情况需要能够支持多重响应,例如 404、200 201 等。
要处理此文档,您可以使用 ResponseType 属性,如下所示:
[ResponseType(typeof(BookDto))]
public async Task<IHttpActionResult> GetBook(int id)
{
BookDto book = await db.Books.Include(b => b.Author)
.Where(b => b.BookId == id)
.Select(AsBookDto)
.FirstOrDefaultAsync();
if (book == null)
{
return NotFound();
}
return Ok(book);
}
看看here
编辑:
在 Asp.Net Core 中,您使用 ProducesResponseType 属性,每个方法可以多次使用该属性
参见 here
例子
[ProducesResponseType(typeof(BookDto), 200)]
[ProducesResponseType(typeof(object), 201)]
public async Task<IActionResult> GetBook(int id)
{
BookDto book = await db.Books.Include(b => b.Author)
.Where(b => b.BookId == id)
.Select(AsBookDto)
.FirstOrDefaultAsync();
if (book == null)
{
return NotFound();
}
return Ok(book);
}
编辑:点网核心之前的多重响应属性
您可以使用 Swagger 来帮助记录/描述您的 API,它们有一个名为 SwaggerResponse 的自定义属性
Swagger的.Net端口是Swashbuckle,看看here
