如何在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
是转换结果的类型。 它会为你做内容协商。
您还可以从ObjectResult
inheritance并设置要在构造函数中写入的状态代码和数据。
有关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可能很有用。
- entity framework核心:私有或受保护的导航属性
- 是否真的需要.net core 2 API中的services.AddSingleton
- 使用csproj dotnetcore将文件复制到输出目录
- ASP.NET Core 2 – 身份 – 自定义角色的DI错误
- 如何修复’Microsoft.NETCore.App’,找不到版本’1.1.2’?
- 是否可以静默运行.NET Core控制台应用程序(隐藏控制台窗口)?
- .net核心中的WCF(TransportWithMessageCredential)
- 在Entity Framework Core中创建迁移时如何配置DbContext?
- 如何解决.net核心构建错误NETDSDK1061和警告MSB3277