HttpContext.TraceIdentifier那严谨的设计

前言

Asp.Net Core中有一个不受人重视的属性HttpContext.TraceIdentifier,它在链路追踪中非常有用,下面是官方的定义:

0432edbc84548573328b732299aaf8c8.png

在项目中一般会将该字段输出到每一条日志中,也可以将此Id作为通用响应字段返回前端,后续可以根据该属性和日志匹配,快速定位整个链路日志。在本地开发时我通常观察到该值的格式大概这个样子0HLEACIU86PT6:0000000D,在生产环境中查看日志时,却不是这种格式,而是Guid格式,虽然都是唯一标识,都能满足我的需要,但是为什么会产生这一差异令我困惑,最初以为是第三方日志组件对该字段进行了赋值,在我的不懈努力下,最终确定该差异的原因是部署方式差异导致,分享给各位。

差异对比

创建一个Asp.Net Core新项目,在示例代码中添加一行日志,打印该属性

[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{_logger.LogInformation(Request.HttpContext.TraceIdentifier);return Enumerable.Range(1, 5).Select(index => new WeatherForecast{Date = DateTime.Now.AddDays(index),TemperatureC = Random.Shared.Next(-20, 55),Summary = Summaries[Random.Shared.Next(Summaries.Length)]}).ToArray();
}

Kestre部署时的表现

VS中使用控制台启动项目,调用几次接口,输出如下fe14421bde84a2aaf9789b28ae35fc26.png可见TraceIdentifier有下面两部分组成{ConnectionId}:{Request number},第一部分ConnectionId标识同一次连接,第二部分Request number标识,当前是该连接的第n次请求起到计数的作用。而两者的组成{ConnectionId}:{Request number}就可以标识唯一一次请求。

IIS部署时的表现

用上面的的程序,不做任何更改,在VSIIS Express启动,调用几次接口,输出如下,由于没使用文件日志,IIS Express启动时没有窗口可以看输出,只能通过VS的调试窗口查看输出如下:cc6bd13dece15e1549e73e20799882a0.png这里可以很明显地看出,我们打印的TraceIdentifierGUID格式。

差异的原因

本地开发时我一般不会选择IIS Express启动,因为它速度慢,也不能方便的查看日志输出。所以正如上文测试的那样,我在本地使用只看到一种格式:{ConnectionId}:{Request number}

我们生产环境是部署在Windows Server中,而在windows下部署,使用IIS托管则比使用控制台更加安全稳定,所以这种部署方式输出的TraceIdentifier和上文中使用IIS Express表现是一致的。

那为何不同的部署方式产生该差异呢?

其实这是Asp.Net Core设计使然。在IIS上,它(TraceIdentifier)来自HTTP.sys(内核驱动程序)并暴露给应用程序,以便您可以跟踪该ID,从内核到应用程序并返回到内核,它的值来自IIS生成并传递给我们的应用。使用Kestrel,请求不需要iis对其进行转发,我们的应用程序就是链路的第一个程序,没有程序会传给它一个链路ID,所以程序自己需要生成一个,也就是我们看到的这种{ConnectionId}:{Request number}

总结

在不同的部署方式下,Asp.Net Core对TraceIdentifier有不同的表现,是程序设计上的一种严谨。在IIS部署时,该属性值来自IIS内核的传递,以便我们可以跟踪IIS内核到我们的程序,也保持了IIS式的风格。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之实现多张图片点击预览(支持放缩)和滑动

1 需求 多张图片通过recycleView展示&#xff0c;然后点击具体一张图片支持预览(支持放缩)和滑动 2 解决办法 BaseRecyclerViewAdapterHelper com.github.chrisbanes.photoview.PhotoView ViewPage2 组合起来真香 https://github.com/CymChad/BaseRecyclerViewAdapt…

【Envi风暴】Envi5.4经典安装图文教程

ENVI(The Environment for Visualizing Images)是一个完整的遥感图像处理平台,应用汇集中的软件处理技术覆盖了图像数据的输入/输出、图像定标、图像增强、纠正、正射校正、镶嵌、数据融合以及各种变换、信息提取、图像分类、基于知识的决策树分类、与GIS的整合、DEM及地形信…

错误: nknown column 'xxxx' in 'where clause'

nknown column sdsds in where clause 运行环境&#xff1a;jdk1.7.0_17tomcat 7 spring&#xff1a;3.2.0 mybatis&#xff1a;3.2.7 eclipse 错误&#xff1a;nknown column sdsds in where clause 错误原因&#xff1a;数据库查询无用&#xff0c;可能很多写sql语句都会遇到…

查缺补漏系统学习 EF Core 6 - 批量操作

推荐关注「码侠江湖」加星标&#xff0c;时刻不忘江湖事这是 EF Core 系列的第七篇文章&#xff0c;上一篇文章讲述了 EF Core 中的实体数据修改。这篇文章讲一讲 EF Core 如何进行批量操作。在众多的 ORM 框架中&#xff0c;EF Core 的功能并不是最强大的那个&#xff0c;性能…

半小时一篇文过完C语言基础知识点

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本文定位读者为小白读者&#xff0c;将使用最快的方法过完C语言基础知识…

php变量的判空和类型判断

&#xff08;1&#xff09;var_dump(); 判断一个变量是否已经声明并且赋值&#xff0c;并且打印类型和值 <?php $a; var_dump($a);//输出null<?php var_dump($a);//输出null<?php$a 10; var_dump($a);//输出 int 10&#xff08;2&#xff09;isset() 判断一个变量…

【Envi风暴】Envi插件大全:多波段拆分工具的巧妙使用

很多场合下需要做波段合成,比如波段432合成赋予红绿蓝,构造标准假彩色等等。合成后的文件通常包含多个单波段文件,在Envi中使用layer stacking工具将多个单波段数据合成为一个文件,如下所示: 那么问题来了,合成后的数据该怎样拆开为原来的单波段呢?今天我们就来学习一种…

php表格怎么合并单元格格式化,table标签的结构与合并单元格的实现方法

1.示例代码&#xff1a;复制代码 代码如下:#1234一个完整的例子&#xff1a;复制代码 代码如下:#FirstnameLastnamePhoneQQ1qianshou111111111111111111112qianshou111111111111111111113qianshou111111111111111111114qianshou111111111111111111112.合并上下的单元格(rowspan…

《看聊天记录都学不会C语言?太菜了吧》(9)老公饼真的有老公送?

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

@Springboot搭建项目controller层接收json格式的对象失败

今天在使用swagger2测试的时候出错 1、requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容&#xff0c;比如说&#xff1a;application/json或者是application/xml等。一般情况下来说常用其来处理application/json类型。 2、 通过req…

『技术群里聊些啥』HttpClient 如何判断是同一终结点

前言官方文档对 HttpClientHandler.MaxConnectionsPerServer 属性有如下说明&#xff1a;获取或设置使用 HttpClient 对象发出请求时允许的最大并发连接数&#xff08;每个服务器终结点&#xff09;。请注意&#xff0c;该限制针对每个服务器终结点&#xff0c;例如&#xff0c…

【Envi风暴】Envi 5.3 SP1经典安装手把手图文教程(含补丁文件)

Envi 5.3具有传感器和数据支持、图像处理和显示、用户界面、二次开发等新功能,本文讲解Envi 5.3 SP1完全安装教程。 下载后的软件包目录如下所示: 目录 一、Envi 5.3 SP1安装 二、Envi 5.3 SP1下载地址 一、Envi 5.3 SP1安装 点击IDL_ENVI5.3 SP1win64.exe,开始安装,…

《看聊天记录都学不会C语言?太菜了吧》(10)程序媛聪明绝顶了

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

遥感方法研究张掖市1999-2010年土地利用变化

【方法思路】:本文选取张掖地区两期影像(Landsat 1999-07-07,2010-09-07),用监督分类方法获取各期土地利用类型,与已有的土地利用现状矢量图(landuse2000)相叠加,通过对比分析,进而得出张掖市1999-2010年间土地利用变化情况。 一、实验数据 采用Landsat Tm影像,原始…

【MongoDB】递归获取字段更新表达式,更新复杂数据类型对象

在实际更新Mongo对象时发现&#xff0c;原有的更新代码无法更新复杂的数据类型对象。恰好看到张占岭老师有对该方法做相关的改进&#xff0c;因此全抄了下来。 总的核心思想就是运用反射与递归&#xff0c;对对象属性一层一层挖掘下去&#xff0c;循环创建父类及之类的更新表达…

java openxml 操作 word,openxml word转成xml

word2007无法打开Office Open XML 文档由于种种原因&#xff0c;如程序安装错误、注册表被修改&#xff0c;或系统被病毒侵害等。有时候会造成WORD 2007无法打开.DOC文档的问题&#xff0c;常规的处理办法(右键选择“打开方式”)无效。可以试试如下的方法 &#xff1a;1.打开注…

聊一聊CLR源码中的 #define 是怎么玩的

一&#xff1a;背景 如果大家看过 CLR 源码&#xff0c;会发现里面有很多 #define 宏定义,比如说 fusionhelpers.hpp 头文件里。如果你不熟悉 C &#xff0c;看到这些 #define 应该会很晕的&#xff0c;这篇我们就来简单聊聊 define 的玩法&#xff0c;其实说白了很简单, #defi…

《看聊天记录都学不会C语言?太菜了吧》(11)2分钟领悟数组

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

基于CentOS 7配置Nginx正向代理

Nginx是一款以轻量级、低内存开销、支持缓存、支持反向代理&#xff0c;负载均衡&#xff0c;电子邮件服务而著称。对于鲜为人知的是&#xff0c;它还可以作为一个简单易用的正向代理服务器。本文简要描述这个正向代理功能并给出演示&#xff0c;供大家参考。 有关Nginx的安装请…

【ArcObject开发】实验:ArcObject地图开发基本操作

ArcObjects,是基于Microsoft COM技术所构建的一系列COM组件集,是在ArcGIS Desktop平台基础上的二次开发,开发语言为VBA(Vistal Basic for Application)。下面将AO开发的中的一系统基本操作做一简单的说明。 下图是功能主面板,有三个主要功能:地图漫游、地图制图和创建元素…