0

有没有办法扩展 IActionResult 以便所有控制器方法返回相同的响应对象(例如:CommonActionResult)和 HttpResponseCode、消息和响应对象(例如: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
        {
        }
4

2 回答 2

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/

于 2019-04-14T10:19:18.977 回答
0

如果您只想要一个通用返回类型,请使用IActionResult. 这将接受任何操作结果类型,例如OkResult, OkObjectResult, BadRequestResult,NotFoundResult等。

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

public IActionResult FooOrBar()
{
   ...

   if (something)
       return Ok(foo);
   else
       return Ok(bar);
}
于 2019-04-11T16:45:23.020 回答