异常处理 ASP.NET MVC Web API

2023-11-24

首先,是的,我们已经创建并正在使用一个继承自 ExceptionFilterAttribute 的异常过滤器。它会在应用程序启动时在我们的身份过滤器之后立即注册到配置中,并且如果我们的 API 内部某个地方发生错误,它的工作效果几乎与预期一致。

话虽这么说,我正在寻找一种方法来处理在到达 API 之前发生的错误。

推理:我们不想返回 YSOD 和/或 IIS HTML 错误。我们总是希望使用自定义异常过滤器/处理程序,以便我们可以正确处理日志记录并向用户返回 JSON 响应。

截至目前,使用 Fiddler 发出请求,我可以附加到 w3wp.exe 进程,并看到请求命中了 global.asax 中的 Application_BeginRequest 方法。之后,它只返回 500 响应。它永远不会因异常而中断代码,也不会在此之后遇到我的任何断点。它似乎返回了 IIS 错误。我们绝不希望这种情况发生。我们需要能够捕获所有这些“低级”异常、记录它们并向用户返回有意义的内容。

我们可以采取一些措施来处理之前出现的 ASP.NET MVC Web API 代码中的错误吗?


尽管我喜欢 Darin 的答案,但它在我们的情况下不起作用,因为 ASP.NET MVC Web API 框架在内部抑制/处理异常,并且不会重新抛出以命中 Global.asax 中的 Application_Error 方法。我们的解决方案是这样的。

我最终创建了一个自定义 DelegatingHandler,如下所示:

public class PrincipalHandler : DelegatingHandler
{
    protected const string PrincipalKey = "MS_UserPrincipal";
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        setAnonymousPrincipal();

        request = InitializeIdentity(request);

        return base.SendAsync(request, cancellationToken)
            .ContinueWith(r =>
                              {
                                  // inspect result for status code and handle accordingly
                                  return r.Result;
                              });
    }
}

然后,我将其插入到 HttpConfiguration 中,以确保它是第一个/最后一个被命中的处理程序。处理程序在 Web API 中的工作方式是分层的。因此,每个请求要命中的第一个处理程序将是响应中要命中的最后一个处理程序。至少这是我的理解,如果我错了,请随时纠正我。

public static void ConfigureApis(HttpConfiguration config)
{
    config.MessageHandlers.Insert(0, new PrincipalHandler());
}

通过使用这种方法,我们现在可以检查从 Web API 和控制器返回的任何响应中的每个结果。这使我们能够处理由于某些内容未按预期返回而可能需要发生的任何日志记录。现在,我们还可以更改返回的响应内容,以便 IIS 在看到某些 HTTP 状态代码时不会插入任何默认的 HTML 错误页面。

我遇到的唯一问题是,他们不会在从 base.SendAsync() 返回的任务上发送异常,我希望他们在即将发布的 Web API 中对此进行更改。所以我们唯一需要参考的信息就是HTTP状态码,并尽力给消费者一个合理的或可能的答案。

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

异常处理 ASP.NET MVC Web API 的相关文章

随机推荐

  • 悬停时颜色转灰度在 IE11 中不起作用

    我在用着Gray网站上的一些元素 但是 我无法让它在 IE11 中工作 例如 在下面的小提琴中 我使用 JS 添加grayscale and grayscale fade类 以便图像在悬停时从彩色渐变为灰度 我如何让它在 IE11 中工作
  • 在ggplot2中创建堆积密度图

    我正在尝试在 ggplot2 中创建堆积密度图 并且我还试图了解 qplot 相对于 ggplot 的工作原理 我在网上找到了下面的例子 qplot depth density data diamonds geom density fill
  • 为什么我的自定义控件的 Text 属性不会显示在“属性”窗口中?

    我有一个继承自 UserControl 的用户控件 这是一个按钮 因此我尝试使用像真实按钮一样的 Text 属性来更改按钮中的文本 而不是像 Text 这样命名我自己的文本 我有以下代码 但它不起作用 即它没有显示在属性窗口中 标签的名称是
  • 架构 i386 的未定义符号,为 iOS 构建?

    我已经下载了 iProcessing 框架 允许您为 iPhone 构建本机 javascript 应用程序 当我尝试编译时 我得到 Undefined symbols for architecture i386 ADBannerConte
  • 在计算机之间导入/导出 Chrome devtools 断点和设置

    Quoting 最初的想法 我遇到了一个问题 我需要将所有调试器断点共享给我的同事 以便在他结束时调试问题 因此考虑实施诸如从一个系统导出调试器点并在另一系统导入之类的东西 由于 devtools 不提供内置的导入 导出功能 还有其他方法吗
  • 将远程图像保存到隔离存储中

    我尝试使用此代码下载图像 void downloadImage WebClient client new WebClient client DownloadStringCompleted new DownloadStringComplete
  • 如何防止 URLDownloadToFile 从缓存中检索?

    我正在使用 URLDownloadToFile 从网站检索文件 后续调用将返回原始文件而不是更新版本 我假设它正在检索缓存的版本 在调用 URLDownloadToFile 之前使用相同的 URL 调用 DeleteUrlCacheEntr
  • invalidateList 和 invalidateDisplayList 有什么区别?

    我有一个 DataGrid 其中填充有 ArrayCollection 中的对象 更新对象的字段之一后 我希望屏幕更新 数据源不可绑定 因为我是在运行时构建它的 而且我还不知道如何使其可动态绑定 这是另一个问题 在这种情况下 如果我在网格上
  • 清理 Mercurial 存储库

    我的 hg 存储库的历史记录中有一堆文件已被删除 它们导致存储库变得相当大 其中一些是图像 以及项目早期的 sql 转储 以及其他一开始就不应该提交的东西 我如何让 Mercurial 忘记这些东西并再次将我的存储库缩小到合理的大小 我是否
  • C# 中的非对称加密示例

    我需要通过 TCP 连接将机密数据发送到服务器 我做了很多研究并且理解了理论部分 根据我的研究 我想做以下事情 注意有一个服务器和一个客户端 我们假设客户端或服务器的公钥可以被任何人获取 客户创建他的公钥和私钥 他能够用他的私钥加密并用他的
  • 不带值的 MediaWiki URL 参数

    The query的一部分URL似乎由键值对组成 并由相关联 我一直习惯使用 jQuery param 函数对我的查询字符串进行 URL 编码 因为我发现它使我的代码更具可读性和可维护性 在过去的几天里 我发现自己在调用 MediaWiki
  • SimpleDateFormat 类中有哪些可用的日期格式?

    谁能告诉我 SimpleDateFormat 类中可用的日期格式 我已经浏览了 api 但找不到满意的答案 非常感谢任何帮助 下面详细描述了日期和时间格式 SimpleDateFormat Java Platform SE 7 日期和时间模
  • 如何将 String 上的 PageRequest 作为数值进行排序

    我目前有一个系统 可以过滤和排序数据库中的记录并将它们作为分页对象返回 其中一行是这样的 final PageRequest request new PageRequest this pagingSettings getPageNumber
  • 已知起点、终点和半径,如何求圆弧圆周上的点?

    请参阅下图以直观地了解我的问题 我有点 1 和 2 的坐标 它们是通过使用其他可用信息的公式得出的 参见问题 如何计算已知半径和圆心的圆上的点 我现在需要做的 与轨道建设分开 是将点 1 和点 2 之间的点绘制为绿色 这样做的最佳方法是什么
  • Cordova 6.4.0 Android 构建发布 apk 时出错

    我有一个项目在 cordova 6 3 1 上运行良好 然后我将 cordova 和我的项目更新到 6 4 0 在此之后 我第一次构建时 gradle 也自动更新了 现在我遇到一个重要的问题 我需要在 build json 文件中包含密钥库
  • MousePressEvent,QGraphicsView中的位置偏移

    我有一些困难QGraphicsView and QGraphicsScene 当我缩放 取消缩放场景并使用 mousePressEvent 创建项目时 我的位置有一个偏移 如何避免这种情况 event pos 似乎是问题 from PyQt
  • 如何使用 selenium 3.0.0 beta 关闭 geckodriver

    环境 Win 7 Selenium 3 0 0 测试版 FireFox 49 0 1 System setProperty webdriver gecko driver C geckodriver exe WebDriver driver
  • Apache ProxyPass 未加载资源

    我配置了 apache proxypass 它可以工作 但无法加载图像 javascript CSS 等 我想 proxypass 到另一台服务器 而不是本地主机 以下是我的配置 查看错误图像
  • Google 地图 API 的服务帐户

    On the Google 云身份验证概述页面上对云服务进行了以下说明 对于几乎所有情况 无论您是在本地开发还是在外部开发 生产应用程序 您应该使用服务帐户 而不是 用户帐户或 API 密钥 考虑到这一点 我的问题是 当使用 Google
  • 异常处理 ASP.NET MVC Web API

    首先 是的 我们已经创建并正在使用一个继承自 ExceptionFilterAttribute 的异常过滤器 它会在应用程序启动时在我们的身份过滤器之后立即注册到配置中 并且如果我们的 API 内部某个地方发生错误 它的工作效果几乎与预期一