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

C# 如何为ABP中的默认异常响应添加值?,c#,asp.net-core,aspnetboilerplate,C#,Asp.net Core,Aspnetboilerplate,我想向异常添加一个ID(GUID),并且: 记录下来 将其返回到客户端json响应 我应该在何处生成此日志ID值并将其添加到记录的异常消息中。在哪里更改以下默认响应 { "targetUrl": null, "result": null, "success": false, "error": { "message": "An internal error occurred during your request!", "details": "..." },

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

  • 记录下来
  • 将其返回到客户端json响应
  • 我应该在何处生成此日志ID值并将其添加到记录的异常消息中。在哪里更改以下默认响应

    {
      "targetUrl": null,
      "result": null,
      "success": false,
      "error": {
        "message": "An internal error occurred during your request!",
        "details": "..."
      },
      "unAuthorizedRequest": false
    }
    

    我正在使用.NET Core版本。

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

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

    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});
        }
    }
    


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

    ...
    using Abp.Web.Configuration;
    ...
    public override void PreInitialize() 
    {
        Configuration.Modules.AbpWebCommon().SendAllExceptionsToClients = true;
    }
    ...
    


    结果包装和异常处理:

    如果操作已成功执行,ASP.NET样板文件默认情况下不会包装Web API操作。但是,它处理并包装异常。您可以将WrapResult/DontWrapResult属性添加到操作和控制器,以实现更精细的控制。您可以从启动配置(使用configuration.Modules.AbpWebApi()…)更改此默认行为。有关结果包装的更多信息,请参见AJAX文档


    包装结果

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

    public interface ITestAppService : IApplicationService
    {
        [DontWrapResult]
        DoItOutput DoIt(DoItInput input);
    }
    


    最后,您可以编写自己的ResultRapperHandler

    公共类CustomResultRapperHandler:ResultRapperHandler,ITransientDependency
    {
    //...
    受保护的覆盖无效WrapRequestId(HttpRequestMessage请求、HttpResponseMessage响应)
    {
    //...
    基本需求(请求、响应);
    }
    }
    
    如果要禁用显示特定AJAX调用的消息,请在abp.AJAX选项中添加
    abpHandleError:false

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

    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});
        }
    }
    


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

    ...
    using Abp.Web.Configuration;
    ...
    public override void PreInitialize() 
    {
        Configuration.Modules.AbpWebCommon().SendAllExceptionsToClients = true;
    }
    ...
    


    结果包装和异常处理:

    如果操作已成功执行,ASP.NET样板文件默认情况下不会包装Web API操作。但是,它处理并包装异常。您可以将WrapResult/DontWrapResult属性添加到操作和控制器,以实现更精细的控制。您可以从启动配置(使用configuration.Modules.AbpWebApi()…)更改此默认行为。有关结果包装的更多信息,请参见AJAX文档


    包装结果

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

    public interface ITestAppService : IApplicationService
    {
        [DontWrapResult]
        DoItOutput DoIt(DoItInput input);
    }
    


    最后,您可以编写自己的ResultRapperHandler

    公共类CustomResultRapperHandler:ResultRapperHandler,ITransientDependency
    {
    //...
    受保护的覆盖无效WrapRequestId(HttpRequestMessage请求、HttpResponseMessage响应)
    {
    //...
    基本需求(请求、响应);
    }
    }
    
    感谢阿尔珀的详细回答。我只想添加另一个属性,即异常代码(生成的UID)并将其返回给用户。然后将其记录在日志服务中,以发现其简单性。不写我自己的包装就可以了吗?对不起,不行!编写您自己的实现。感谢Alper提供的详细答案。我只想添加另一个属性,即异常代码(生成的UID)并将其返回给用户。然后将其记录在日志服务中,以发现其简单性。不写我自己的包装就可以了吗?对不起,不行!编写自己的实现。