Skip to main content
 首页 » 编程设计

c#之具有通用对象的 WebAPI CreateResponse

2024年04月17日37落叶无声

我正在尝试找出一种方法来在我的响应中返回一个对象,同时仍然保持可理解的返回类型。

所以对于初学者来说,我知道这会按预期工作。

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