2020年4月10日更新:

官方 nuget 新版本已发布

https://www.nuget.org/packages/Exceptionless

2020年1月17日更新:

nightly build 版本已发布

https://www.myget.org/feed/exceptionless/package/nuget/Exceptionless

2020年1月16日更新:

PR 已合并了,等待官方发布新的 nuget 包

2020年1月10日更新:

clone 官方源码调了一下找到问题所在了,UWP 的 release 模式下, Assembly.GetCallingAssembly() 不可用导致,已给 Exceptionless 发 PR 了。

https://github.com/exceptionless/Exceptionless.Net/pull/219

2020年1月9日更新:

目前 Exceptionless 存在 bug,导致在 UWP 的 release 模式下不可用,已给官方提 bug

https://github.com/exceptionless/Exceptionless.Net/issues/218

各位看官暂时不用往下看了。

前几个星期在公司的测试服务器上搭建了 Exceptionless 对公司的 Asp.net core 项目进行遥测。在之前都是远程桌面登录上去,然后去翻日志文件看有没有异常,效率极其的低。用了 Exceptionless 之后,效率高了不少,而且能收集到更多信息了。

最近准备要过年了,项目也上线了一段时间趋于稳定,算是比较闲了一点。想着要不把手上的 UWP 项目也加上 Exceptionless 进行遥测吧,毕竟微软商店的 Dashboard 那异常也几乎是看不出啥的,而且这测试服务器性能又是过剩的,不用白不用。

但我一操作起来,就发现了个大问题,Exceptionless 官方并没有提供 UWP 的库(Winform、WPF、asp.net core 的都有)。翻查了 github 上相关的 issue,官方建议是用 .net standard 版本的。然而实际操作之后,我发现还需要额外的代码来处理 UWP 中的 UnhandledException,本文就记录一下。

首先当然是在 Exceptionless 平台上创建项目获取 ApiKey 了,这个就不多说了。然后 UWP 项目引用 Exceptionless 的 nuget 包

在 App.xaml.cs 的构造函数中添加 SetUpExceptionless 代码:

public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
SetUpExceptionless();
}

然后先初步实现 SetUpExceptionless 方法:

private void SetUpExceptionless()
{
var client = ExceptionlessClient.Default;
client.Configuration.ServerUrl = "";
client.Configuration.ApiKey = ""; client.Startup();
}

由于是自建 Exceptionless 平台,所以需要配置一下 ServerUrl。ApiKey 配置为从平台获取到的 ApiKey。

接下来是处理 UnhandledException,在 UWP 平台中,有两种情况,一种是在 App 类上触发的,另一种是在 AppDomain 上触发的。这两种我们都要监听到。但如何监听呢,这里先看看官方在 WPF 平台是如何实现的:

主要是图上红框的两行,第一行主要是捕获线程的异常,第二行捕获了 App 的异常。而捕获线程异常的方法内部用到了 Winform 的类,这里我们就忽略,因为 UWP 里没有这些类,而且 UWP 中非 UI 线程的异常是可以通过 AppDomain.UnhandledException 事件来捕获的。这里我们看第二行的实现

可见是对 System.Windows.Application.Current.DispatcherUnhandledException 事件进行了订阅,然后给 Exceptionless。

依样画葫芦,完善我们的 SetUpExceptionless 方法:

private void SetUpExceptionless()
{
var client = ExceptionlessClient.Default;
client.Configuration.ServerUrl = "";
client.Configuration.ApiKey = ""; UnhandledException += (sender, args) =>
{
var contextData = new ContextData();
contextData.MarkAsUnhandledError();
contextData.SetSubmissionMethod("App_UnhandledException"); args.Exception.ToExceptionless(contextData, ExceptionlessClient.Default).Submit(); client.ProcessQueue();
};
AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
{
var exception = args.ExceptionObject as Exception;
if (exception == null)
{
return;
} var contextData = new ContextData();
contextData.MarkAsUnhandledError();
contextData.SetSubmissionMethod("AppDomain_UnhandledException"); exception.ToExceptionless(contextData, ExceptionlessClient.Default).Submit(); client.ProcessQueue();
}; client.Startup();
}

接下来我们测试一下是否起效,先手动抛个异常,我就直接建一个 Button,然后 Click 抛个异常好了。

private void TestButton_Click(object sender, RoutedEventArgs e)
{
throw new Exception("测试 Exceptionless 集成");
}

运行后,点击按钮,然后 App 炸掉之后我们去看 Exceptionless 平台。

完美!

【UWP】在 UWP 中使用 Exceptionless 进行遥测的更多相关文章

  1. UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等) - walterlv

    原文:UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等) - walterlv UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等) ...

  2. UWP: 在 UWP 中使用 Entity Framework Core 操作 SQLite 数据库

    在应用中使用 SQLite 数据库来存储数据是相当常见的.在 UWP 平台中要使用 SQLite,一般会使用 SQLite for Universal Windows Platform 和 SQLit ...

  3. [UWP]理解ControlTemplate中的VisualTransition

    1. 前言 VisualTransition是控件模板中的重要组成部分,无论是自定义控件或者修改控件样式都会接触到VisualTransition.明明这么重要,博客园上好像都没多少关于VisualT ...

  4. [UWP]在UWP平台中使用Lottie动画

    最近QQ影音久违的更新了,因为记得QQ影音之前体验还算不错(FFmepg的事另说),我也第一时间去官网下载体验了一下,结果发现一些有趣的事情. 是的,你没看错,QQ影音主界面上这个动画效果是使用Lot ...

  5. UWP 在 WebView 中执行 JavaScript 代码(用于模拟用户输入等)

    UWP 中使用 WebView 时可以在网页中额外执行一些代码.于是你几乎可以在网页上做任何事情,那些你可以在浏览器控制台中做的事情. 本文将介绍做法. 本文内容 准备环境 执行 JavaScript ...

  6. UWP 流畅设计中的光照效果(容易的 RevealBorderBrush 和不那么容易的 RevealBackgroundBrush)

    在 Windows 10.0.16299 中,RevealBrush 被引入,可以实现炫酷的鼠标滑过高亮效果和点击光照.本文将告诉大家如何完整地实现这样的效果. Reveal 的效果(自带) 在微软官 ...

  7. 在UWP的XAML中使用原始类型

    问题: I'm trying to access the system namespace for StaticResource variables in XAML on UWP. Here's (m ...

  8. UWP 在Xaml中使用cu和fcu资源

    之前一直不知道这个,最近看微软的WTS项目更新,在Xaml中定义了 xmlns:fcu ="http://schemas.microsoft.com/winfx/2006/xaml/pres ...

  9. UWP 查找模板中的控件

    这个标题我也不知道咋起,意思说一下你就明白. 1. 对官方控件的模板进行定制修改,以满足多样化需求,还有漂亮的UI 比如ListView,GridView等. 2. 在设计的情况下并没有这个控件,而在 ...

随机推荐

  1. 2019ccpc哈尔滨打铜记

    小学生日记: 2019.10.13,哈尔滨,打了个铜 开头 先说结论,这次失败,我的锅70%,sdl的锅5%,ykh25% Day0 周五, 我们队出现了奇怪的厄运上身 首先是我中途在飞机上数据线突然 ...

  2. Java并发读书笔记:Lock与ReentrantLock

    Lock位于java.util.concurrent.locks包下,是一种线程同步机制,就像synchronized块一样.但是,Lock比synchronized块更灵活.更复杂. 话不多说,我们 ...

  3. Mongodb 3.2.8: 集群环境搭建

    简介 MongoDB是一种面向文档的数据库管理系统,由C++撰写而成,以此来解决应用程序开发社区中的大量现实问题.2007年10月,MongoDB由10gen团队所发展.2009年2月首度推出. ## ...

  4. HTTP&HTTPS协议详解之HTTP篇

    一.HTTP简介 01.什么是HTTP HTTP(HyperText Transfer Protocol ,超文本传输协议),是一个基于请求与响应的,无状态的,应用层的协议,常基于TCP/IP协议传输 ...

  5. c#学习笔记之委托

    委托 最近自己在调试C#项目,发现经常可以看到委托和lambda表达式,各种花里胡哨的写法把我给整的云里雾里的,于是自己特意花了一点功夫来整理关于delegate的相关知识,方便自己日后查阅. 何为委 ...

  6. node - 简单的爬虫案例

    cherrio模块 安装 cnpm install cherrio 使用方法 const cheerio = require('cheerio') const $ = cheerio.load('&l ...

  7. Angular RxJs:针对异步数据流编程工具

    一. RxJs:针对异步数据流编程工具 1. 创建subject类对象(发送方) 2. subject.subscribe(观察者); (注册观察者对象observer,可以注册多个相当于回调函数取数 ...

  8. [Linux-CentOS7]yum清华源CentOS7

    shell直接运行 cat > 01.yumrepo.sh << 'EOF' # 创建备份路径 mkdir -p /etc/yum.repos.d/repo.bak/ # 备份源 m ...

  9. MyBatis 与Ibatis 区别

    Ibatis 是 Mybatis 的前身,两者都是优秀的持久层框架. 区别: 1.mybatis 实现接口绑定,不需要具体接口实现类.但是需要在xml文件中 的 namespace 绑定具体的接口. ...

  10. Git Gui for Windows下载(pull)的正确操作方法