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

问题描述 投票:0回答:2

有没有办法扩展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
        {
        }
c# asp.net-web-api asp.net-core-webapi
2个回答
0
投票

如果您只想要一般的返回类型,请使用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);
}

0
投票

您可以根据您的要求实施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/

© www.soinside.com 2019 - 2024. All rights reserved.