如何在asp.net核心中编写自定义actionResult

在webApi2中,我可以通过inheritanceIHttpActionResult来编写自定义ActionResult。

样品:

public class MenivaActionResult : IHttpActionResult { private readonly HttpRequestMessage _request; private readonly ServiceResponseBase _response; public MenivaActionResult(HttpRequestMessage request, ServiceResponseBase response) { _request = request; _response = response; } public Task ExecuteAsync(CancellationToken token) { HttpResponseMessage httpresponseMessage = _response.Exception != null ? _request.CreateErrorResponse((HttpStatusCode)_response.HttpCode, _response.Exception.Message+":"+_response.Exception.HelpCode) : _request.CreateResponse((HttpStatusCode)_response.HttpCode, _response.Data); return Task.FromResult(httpresponseMessage); } } 

ServiceResponseBase类对象包含服务层的所有exception和数据。

我如何将此代码移植到asp.net核心。 我试过,但我不知道如何从.net核心中的HttpRequestMessage对象创建响应消息。 IActionResult只有Task ExecuteResultAsync(ActionContext context)方法。 我如何修改此方法的响应

这是一个例子:

 public class TestResult { public Exception Exception { get; set; } public object Data { get; set; } } public class TestActionResult : IActionResult { private readonly TestResult _result; public TestActionResult(TestResult result) { _result = result; } public async Task ExecuteResultAsync(ActionContext context) { var objectResult = new ObjectResult(_result.Exception ?? _result.Data) { StatusCode = _result.Exception != null ? StatusCodes.Status500InternalServerError : StatusCodes.Status200OK }; await objectResult.ExecuteResultAsync(context); } } 

如果从操作返回非IActionResult ,则ObjectResult是转换结果的类型。 它会为你做内容协商。

您还可以从ObjectResultinheritance并设置要在构造函数中写入的状态代码和数据。

有关ASP.NET Core中内容协商的更多信息: https : //docs.microsoft.com/en-us/aspnet/core/mvc/models/formatting#content-negotiation

尽管@juunas答案在技术上是正确的,但您真正想要实现的是自定义error handling。 更好的方法是使用动作filter,中间件filter或单独的中间件来解耦这个逻辑(取决于你要覆盖的范围)。

主要思想是控制器不应负责处理exception。 它应该返回OK状态的预期结果或者说错误(抛出exception)并委托管道的其他部分如何解决问题。

查看SO: ASP.NET Core 1.0 Web API中的error handling(将ex.Message发送到客户端)以获取示例。 此外,ASP.NET Core doc中的error handling可能很有用。