有没有办法扩展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
。这将接受任何动作结果类型,例如OkResult
,OkObjectResult
,BadRequestResult
,NotFoundResult
等。
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);
}
}
您还可以在响应标题中添加额外信息,查看此示例以获取更多信息