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

时间:2019-04-11 14:38:48

标签: c# asp.net-web-api asp.net-core-webapi

有没有一种方法可以扩展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
        {
        }

2 个答案:

答案 0 :(得分:0)

如果只需要通用返回类型,请使用function res = binary_multiplication(a,b) nstep = numel(b) ; mat = [zeros( nstep , nstep ) , bsxfun( @times , flipud(b.') , a) ] ; for k=2:nstep mat(k,:) = circshift(mat(k,:),[0,-(k-1)]) ; end sumline = sum(mat) ; res = mod(sumline+circshift(floor(sumline/2)+circshift(floor(sumline/2),[0,-1]),[0,-1]),2) ; 。这将接受任何操作结果类型,例如IActionResultOkResultOkObjectResultBadRequestResult等。

NotFoundResult只是将对象包装在结果中的助手,使您可以直接返回对象,而不必先将其包装在结果中(即ActionResult<T>return obj但是,在使用该类型时,必须返回该特定的对象类型:传递到return Ok(obj)泛型类型参数中的类型。如果需要返回不同的类型,则使用T作为返回值您的方法签名,然后将对象包装在类似IActionResult的地方。

Ok

答案 1 :(得分: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/