【发布时间】:2018-03-30 12:28:41
【问题描述】:
我们当前的许多控制器看起来像这样:
[HttpPost]
public List<Foo> Post([FromBody]Bar model)
{
if (model == null)
{
throw new ArgumentNullException();
}
try
{
// business logic
}
catch (Exception ex)
{
// logging
}
return dto;
}
虽然这里重复了很多代码。我想做的是实现一个处理异常的基本控制器,这样我就可以返回一个标准化响应,其中包含Payload、Success、Error 等字段。
在.net core 之前,这可以通过提供OnException 的覆盖来实现,但这似乎不适用于.net core api 控制器。当我的控制器主体出现问题时,如何整合此异常逻辑以返回自定义响应?
我希望以此为起点:
[HttpPost]
public StandardFoo Post([FromBody]Bar model)
{
if (model == null)
{
throw new ArgumentNullException();
}
// business logic
return new StandardFoo(){Payload: dto};
}
模型验证或business logic 引发的异常会冒泡到某个逻辑,该逻辑返回一个新的StandardFoo,其属性包含异常详细信息。
【问题讨论】:
-
您关注的是错误的方法。您应该避免使用您正在尝试的异常方法的基本控制器以及控制器中的 try catch。控制器应尽可能精简,并将职责合并到另一个类中。这似乎是XY problem。
-
@Nkosi 能否提供一个简单、简洁的示例,说明如何在抛出异常时采用上述控制器并返回自定义响应?
-
@Nkosi 更新了我正在寻找的清晰示例。在这里寻找实用的解决方案,而不是理论。
-
基本控制器在 MVC/WebApi 中通常不是一个好主意,因为它通过继承将 cross cutting concerns 紧密耦合到您的控制器。更好的方法是使用filters,这样您就可以共享功能,同时仍然可以在需要时轻松地在控制器或操作级别选择加入/退出。
标签: c# asp.net-mvc asp.net-core asp.net-core-webapi