如何为所有控制器方法返回公共/通用响应对象?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何为所有控制器方法返回公共/通用响应对象?相关的知识,希望对你有一定的参考价值。

有没有办法扩展IActionResult,以便所有控制器方法返回相同的响应对象(例如:CommonActionResult)与HttpResponseCode,Message和Response对象(例如:ObjectOne,ObjectTwo基于启动的方法)?

    [HttpGet]
    public ActionResult<ObjectOne> Get(string id)
    {
    }

    [HttpGet]
    public ActionResult<ObjectTwo> Get(string name)
    {
    }

    [HttpPost]
    public IActionResult Post(AppPost app)
    {
    }       

我该如何延长?

        public class CommonActionResult : IActionResult
        {
        }
答案

如果您只想要一般的返回类型,请使用IActionResult。这将接受任何动作结果类型,例如OkResultOkObjectResultBadRequestResultNotFoundResult等。

ActionResult<T>只是一个包装结果中的对象的助手,允许你直接返回一个对象,而不必先将它包装在一个结果中(即return obj vs return Ok(obj)。但是,当你使用它时,你必须返回那个特定的对象type:传递给T泛型类型参数的类型。如果需要返回不同的类型,则使用IActionResult作为方法签名中的返回值,然后将对象包装在Ok之类的内容中。

public IActionResult FooOrBar()
{
   ...

   if (something)
       return Ok(foo);
   else
       return Ok(bar);
}
另一答案

您可以根据您的要求实施IHttpAction

这是一个简单的例子:

   public class CustomResult<T> : IHttpActionResult
    {

        private readonly HttpRequestMessage _request;
        private readonly T _content;


        public CustomResult(HttpRequestMessage request, T content)
        {
            _request = request;
            _content = content;
        }

        public CustomResult(HttpRequestMessage request)
        {
            _request = request;
        }

        public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
        {

            if (_content==null)
            {
                 var response =_request.CreateResponse(HttpStatusCode.NoContent, JsonMediaTypeFormatter.DefaultMediaType);
            }else
            {
               var jsonData = JsonConvert.SerializeObject(_content, _content.GetType(), new JsonSerializerSettings
                {
                    ContractResolver = new CamelCasePropertyNamesContractResolver(),
                    Formatting = Formatting.Indented
                });

                        var response = _request.CreateResponse(HttpStatusCode.OK, jsonData, JsonMediaTypeFormatter.DefaultMediaType);
                        response.Content = new StringContent(jsonData, Encoding.UTF8, "application/json");
            }   
            return Task.FromResult(response);
        }
    }

您还可以在响应标题中添加额外信息,查看此示例以获取更多信息

https://www.strathweb.com/2013/06/ihttpactionresult-new-way-of-creating-responses-in-asp-net-web-api-2/

以上是关于如何为所有控制器方法返回公共/通用响应对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何为通用 HTTP 请求的响应文件指定唯一名称?

C++:如何为多个重载函数保留公共代码路径?

如何为调用 API 的方法编写 JUnit 测试?

如何为所有设备制作响应式网站[关闭]

如何为一元 rpc 定义响应标头

如何为不同的xib添加一个共同的视图?