ASP.NET Web API 2:ExceptionLogger 和异常处理程序

2024-02-07

我正在尝试在 Web api 中实现全局异常日志记录,并向用户发送一条带有该错误 ID 的友好消息,这样他就可以带着错误 ID 回到我们这里,以便我们可以修复它。我正在实施两者:

  • System.Web.Http.ExceptionHandling.ExceptionLogger
  • System.Web.Http.ExceptionHandling.ExceptionHandler

这是我的类,它重写了 ExceptionLogger 抽象类:

public class GlobalExceptionLogger : System.Web.Http.ExceptionHandling.ExceptionLogger
{
    public override void Log(ExceptionLoggerContext context)
    {
        LogMessage logMsg = new LogMessage();
        logMsg.ID = System.Guid.NewGuid().ToString();
        logMsg.MessageType = MessageType.ResourceServerAPI;
        logMsg.SenderMethod = context.Request.RequestUri != null ? string.Format("Request URL: {0}", context.Request.RequestUri.ToString()) : "";
        logMsg.Level = MesageLevel.Error;
        logMsg.MachineName = Environment.MachineName;
        logMsg.Message = context.Exception.Message;

        Logger.LogError(logMsg);
    }
}

这是我处理错误的方式:

public class GlobalExceptionHandler : System.Web.Http.ExceptionHandling.ExceptionHandler
{
    public override void Handle(ExceptionHandlerContext context)
    {
        var metadata = new ErrorData
        {
            Message = "An error occurred! Please use the ticket ID to contact our support",
            DateTime = DateTime.Now,
            RequestUri = context.Request.RequestUri,
            ErrorId = //get the ID already logged
        };

        var response = context.Request.CreateResponse(HttpStatusCode.InternalServerError, metadata);
        context.Result = new ResponseMessageResult(response);        
    }
}

由于异常日志记录发生在处理之前,因此将 ID 从异常记录器传递到异常处理程序以向最终用户发送相应的错误 ID 的最佳方法是什么?


你可以将它添加到HttpRequestMessage.Properties:

public static class HttpRequestMessageExtensions
{
    private const string LogId = "LOG_ID";

    public static void SetLogId(this HttpRequestMessage request, Guid id)
    {
        request.Properties[LogId] = id;
    }

    public static Guid GetLogId(this HttpRequestMessage request)
    {
        object value;
        if (request.Properties.TryGetValue(LogId, out value))
        {
            return (Guid) value;
        }

        return Guid.Empty;
    }
}

然后在您的记录器/处理程序中使用这些扩展方法:

public class GlobalExceptionLogger : System.Web.Http.ExceptionHandling.ExceptionLogger
{
    public override void Log(ExceptionLoggerContext context)
    {
        LogMessage logMsg = new LogMessage();
        logMsg.ID = System.Guid.NewGuid().ToString();
        logMsg.MessageType = MessageType.ResourceServerAPI;
        logMsg.SenderMethod = context.Request.RequestUri != null ? string.Format("Request URL: {0}", context.Request.RequestUri.ToString()) : "";
        logMsg.Level = MesageLevel.Error;
        logMsg.MachineName = Environment.MachineName;
        logMsg.Message = context.Exception.Message;

        // Set the ID
        context.Request.SetLogId(logMsg.ID);

        Logger.LogError(logMsg);
    }
}

public class GlobalExceptionHandler : System.Web.Http.ExceptionHandling.ExceptionHandler
{
    public override void Handle(ExceptionHandlerContext context)
    {
        // Get the ID
        var id = context.Request.GetLogId();

        var metadata = new ErrorData
        {
            Message = "An error occurred! Please use the ticket ID to contact our support",
            DateTime = DateTime.Now,
            RequestUri = context.Request.RequestUri,
            ErrorId = id

        };

        var response = context.Request.CreateResponse(HttpStatusCode.InternalServerError, metadata);
        context.Result = new ResponseMessageResult(response);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET Web API 2:ExceptionLogger 和异常处理程序 的相关文章

  • 更新面板工作速度非常慢

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 按扩展名过滤搜索文件返回太多结果

    我正在开发一个 C 控制台应用程序 它必须管理 Windows 操作系统上的文件 我需要获取具有特定扩展名的文件名 列表 我找到了很多解决方案 最建议的是以下一种 HANDLE hFind WIN32 FIND DATA data hFin
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • 在 C 中使用枚举而不是 #defines 作为编译时常量是否合理?

    在 C 工作了一段时间后 我将回到 C 开发领域 我已经意识到 在不必要的时候应该避免使用宏 以便让编译器在编译时为您做更多的工作 因此 对于常量值 在 C 中我将使用静态 const 变量或 C 11 枚举类来实现良好的作用域 在 C 中
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 如何在 sql azure 上运行 aspnet_regsql? [复制]

    这个问题在这里已经有答案了 可能的重复 将 ASP NET 成员资格数据库迁移到 SQL Azure https stackoverflow com questions 10140774 migrating asp net membersh
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • C# 日期时间格式更改

    我想转换 datetime now 格式 日 月 年 时 分 秒 上午 下午 为美国时间格式 即 月 日 年 时 分 秒 上午 下午 此外 我希望转换后的格式为日期时间而不是字符串 因为它存储在数据库中 并且数据库中的字段采用日期时间格式
  • waitForSelector 找不到相关部分

    我使用以下代码与 Puppeteer 来检查相关部分是否已加载 但它总是返回加载错误 这可能是什么原因 缺少哪一部分我不明白 我正在使用下面的代码 async function getResults lnk const results co
  • aleagpu 引发的 TypeInitializationException

    我正在尝试使用 aleagpu 但出现 System TypeInitializationException 我尝试用谷歌搜索问题所在 但找不到任何解决方案 所以请帮忙 该程序是最简单的 class Klazz private const
  • 如何在nx服务之前执行nx构建?

    好奇执行的正确方法是什么nx build命令作为先决条件nx serve 例如 在我的workspace json 的示例中 foo root apps foo sourceRoot apps foo src projectType app
  • Facebook iOS 应用内浏览器中的音频标签

    我有一个带有音频标签的网页 它在移动 Safari 中运行良好 但是 当我从 iOS 上的 Facebook 应用程序打开链接时 它会在应用程序内浏览器中打开 此处 音频拒绝播放 如果显示控件但没有音频 它将表明它正在播放 视频似乎工作正常
  • nodeJS v19 放弃了对 --es-module-specifier-resolution=node 的支持,这使得运行转译的 TypeScript 变得更加困难 [重复]

    这个问题在这里已经有答案了 Typescript 被转换为 JavaScript 因此是一个模块routes ts被转换成routes js在目录中tsc说 如果另一个模块从模块导入名称 例如 路由器 我们会省略后缀 如下所示 import
  • 为什么“None is None is None”返回 True? [复制]

    这个问题在这里已经有答案了 今天 在一次采访中 CTO 问了我一个看起来很简单的问题 这个语句返回什么 None is None is None 我以为Python执行了第一个操作None is None并会返回True 之后就会比较Tru
  • iOS 11 中的 UIRefreshControl() 故障效果

    每次我拉动刷新 TableView 时 UIRefreshControl 都会出现故障 下面是我正在使用的代码 有任何想法吗 在应用程序委托中 UINavigationBar appearance isTranslucent false U
  • Swift flatMap 在与可选数组一起使用时给出意外的结果

    我们有一个 Person 对象数组 每个对象都有另一个 String 数组 这是可选的 我们想要我们社会中的汽车名称的综合列表 struct Person let name String let address String let age
  • 我可以关闭隐式 Python unicode 转换来查找混合字符串错误吗?

    在分析我们的代码时 我惊讶地发现数百万次调用C Python26 lib encodings utf 8 py 15 解码 我开始调试 发现我们的代码库中存在许多小错误 通常是将字符串与 unicode 进行比较 或者添加字符串和 unic
  • SlickGrid 2.0 无法更改奇数索引中的行背景颜色

    我正在尝试使用以下代码更改背景颜色 data getItemMetadata function index if index 5 return cssClasses Unverified 只要索引是偶数 它就可以完美工作 但对于奇数索引 它
  • 如何强制/允许用户下载多个文件? (客户端)

    输入是可变数量的 URL 远程 所有链接图像资源 希望允许用户允许批量下载所有这些 URL 由于我们讨论的是 1000 2000 个图像资源 要求用户为每个 URL 单击 另存为 是不可行的 我最初的尝试是将所有图像下载到一个 blob 中
  • 删除 SwiftUI 中后退按钮的文本

    简而言之 我想要do this https stackoverflow com questions 33025239 remove text from back button keeping the icon 但是使用 SwiftUI Ho
  • 增强子图和捆绑属性

    我正在使用捆绑属性和 adjacency list 并且想使用子图类 struct Vertex int index int seed struct Edge bool visted double weight typedef adjace
  • 从应用程序打开系统设置的特定部分

    我的应用程序有一个快捷方式 可以打开系统设置的存储部分 效果很好 但是如果设置应用程序已经在运行 并且最后离开了显示设置 则您不会被定向到存储设置 但按快捷键时显示设置 在尝试启动存储之前 有没有办法强制打开存储设置 或者关闭 如果未关闭
  • 在真实Apple Watch上调试:应用程序验证失败

    今天我尝试在真正的 Apple Watch 上调试我的 WatchKit 应用程序 在 Xcode 中点击 调试 按钮后 iPhone 主应用程序已正确安装 但 Apple Watch 只显示消息安装xxx失败 错误 应用程序验证失败 Wa
  • 为什么CPU负载的变化不会超过百分之几?

    我正在运行这个命令 grep cpu proc stat awk usage 2 4 100 2 4 5 END print usage 但它只输出 0 99xxxx 之类的东西 如果我进行 apt get 升级或任何过程 我想它会超过 1
  • 在网页中嵌入视频后如何删除 YouTube 品牌?

    我在用 这将删除右侧底部的 Youtube 徽标 并且还删除了悬停时出现的 标题栏 但在这个问题中 当我将鼠标悬停在视频上时 然后在右侧底部 Youtube 缩略图后面 文本出现 当我移开鼠标时 它就会消失 当我使用 autohide 1
  • 恢复在 HBase 中的工作原理

    我想实际观察 HBase 中的恢复是如何工作的 我使用了以下代码片段 Put p new Put Bytes toBytes name10 p setWriteAheadLog true p add Bytes toBytes cf Byt
  • ASP.NET Web API 2:ExceptionLogger 和异常处理程序

    我正在尝试在 Web api 中实现全局异常日志记录 并向用户发送一条带有该错误 ID 的友好消息 这样他就可以带着错误 ID 回到我们这里 以便我们可以修复它 我正在实施两者 System Web Http ExceptionHandli