如何为 ABP 中的默认异常响应添加值?

Hom*_*mam 0 c# asp.net-core aspnetboilerplate

我想向异常添加一个 ID (GUID) 并且:

  1. 记录它
  2. 将其返回给客户端 json 响应

我应该在哪里生成此日志 ID 值并将其添加到记录的异常消息中。在哪里更改以下默认响应?

{
  "targetUrl": null,
  "result": null,
  "success": false,
  "error": {
    "message": "An internal error occurred during your request!",
    "details": "..."
  },
  "unAuthorizedRequest": false
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 .NET Core 版本。

Alp*_*glu 5

如果要禁用显示特定 AJAX 调用的消息,请添加abpHandleError: false到 abp.ajax 选项中。

或者您可以禁用框架异常包装器的默认行为

public class PeopleController : AbpController
{
    [HttpPost]
    [WrapResult(WrapOnSuccess = false, WrapOnError = false)]
    public JsonResult SavePerson(SavePersonModel person)
    {
        //TODO: save new person to database and return new person's id
        return Json(new {PersonId = 42});
    }
}
Run Code Online (Sandbox Code Playgroud)

https://aspnetboilerplate.com/Pages/Documents/Javascript-API/AJAX?searchKey=wrap#asp-net-mvc-controllers


另一件事是;您可以通过以下配置向客户端发送异常详细信息

...
using Abp.Web.Configuration;
...
public override void PreInitialize() 
{
    Configuration.Modules.AbpWebCommon().SendAllExceptionsToClients = true;
}
...
Run Code Online (Sandbox Code Playgroud)

https://aspnetboilerplate.com/Pages/Startup-Configuration#configuring-modules


结果包装和异常处理:

如果操作已成功执行,ASP.NET Boilerplate 默认不会包装 Web API 操作。然而,它处理和包装异常。您可以将 WrapResult/DontWrapResult 属性添加到操作和控制器以进行更精细的控制。您可以从启动配置中更改此默认行为(使用 Configuration.Modules.AbpWebApi()...)。有关结果包装的更多信息,请参阅 AJAX 文档。

https://aspnetboilerplate.com/Pages/Documents/Web-API-Controllers?searchKey=wrap#result-wrapping-exception-handling


包装结果

ASP.NET Boilerplate 使用 AjaxResponse 对象包装动态 Web API 操作的返回值。有关包装的更多信息,请参阅 ajax 文档。您可以启用/禁用每个方法或每个应用程序服务的包装。请参阅此示例应用程序服务:

public interface ITestAppService : IApplicationService
{
    [DontWrapResult]
    DoItOutput DoIt(DoItInput input);
}
Run Code Online (Sandbox Code Playgroud)

https://aspnetboilerplate.com/Pages/Documents/Dynamic-Web-API?searchKey=wrap#wrapping-results


最后,您可以编写自己的 ResultWrapperHandler ...

public class PeopleController : AbpController
{
    [HttpPost]
    [WrapResult(WrapOnSuccess = false, WrapOnError = false)]
    public JsonResult SavePerson(SavePersonModel person)
    {
        //TODO: save new person to database and return new person's id
        return Json(new {PersonId = 42});
    }
}
Run Code Online (Sandbox Code Playgroud)