前言

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

在项目中一般会将该字段输出到每一条日志中,也可以将此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中使用控制台启动项目,调用几次接口,输出如下



可见TraceIdentifier有下面两部分组成{ConnectionId}:{Request number},第一部分ConnectionId标识同一次连接,第二部分Request number标识,当前是该连接的第n次请求起到计数的作用。

而两者的组成{ConnectionId}:{Request number}就可以标识唯一一次请求。

IIS部署时的表现

用上面的的程序,不做任何更改,在VSIIS Express启动,调用几次接口,输出如下,由于没使用文件日志,IIS Express启动时没有窗口可以看输出,只能通过VS的调试窗口查看输出如下:



这里可以很明显的看出,我们打印的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式的风格。

HttpContext.TraceIdentifier那严谨的设计的更多相关文章

  1. ASP.NET Core管道详解[2]: HttpContext本质论

    ASP.NET Core请求处理管道由一个服务器和一组有序排列的中间件构成,所有中间件针对请求的处理都在通过HttpContext对象表示的上下文中进行.由于应用程序总是利用服务器来完成对请求的接收和 ...

  2. 【转】ASP.NET Core 2.0中的HttpContext

      ASP.NET Core 2.0中的HttpContext相较于ASP.NET Framework有一些变化,这边列出一些之间的区别.   在ASP.NET Framework中的 System. ...

  3. vivo 全球商城:电商平台通用取货码设计

    vivo官网商城开发团队 - Zhou Longjian 一.背景 随着O2O线上线下业务的不断扩展,电商平台也在逐步完善交易侧相关的产品功能.在最近的需求版本中,业务方为进一步提升用户的使用体验,规 ...

  4. asp.net core策略授权

    在<asp.net core认证与授权>中讲解了固定和自定义角色授权系统权限,其实我们还可以通过其他方式来授权,比如可以通过角色组,用户名,生日等,但这些主要取决于ClaimTypes,其 ...

  5. Entity Framework (EF) Core工具创建一对多和多对多的关系

     一. EntirtyFramework(EF)简介 EntirtyFramework框架是一个轻量级的可扩展版本的流行实体框架数据访问技术,微软官方提供的ORM工具让开发人员节省数据库访问的代码时间 ...

  6. 【.NET Core项目实战-统一认证平台】第二章网关篇-定制Ocelot来满足需求

    [.NET Core项目实战-统一认证平台]开篇及目录索引 这篇文章,我们将从Ocelot的中间件源码分析,目前Ocelot已经实现那些功能,还有那些功能在我们实际项目中暂时还未实现,如果我们要使用这 ...

  7. C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入

    C# 嵌入dll   在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...

  8. ASP.NET Core Web 应用程序系列(一)- 使用ASP.NET Core内置的IoC容器DI进行批量依赖注入(MVC当中应用)

    在正式进入主题之前我们来看下几个概念: 一.依赖倒置 依赖倒置是编程五大原则之一,即: 1.上层模块不应该依赖于下层模块,它们共同依赖于一个抽象. 2.抽象不能依赖于具体,具体依赖于抽象. 其中上层就 ...

  9. 初识ASP.NET CORE

    首先创建一个asp.net core web应用程序 第二步 目前官方预置了7种模板项目供我们选择.从中我们可以看出,既有我们熟悉的MVC.WebAPI,又新添加了Razor Page,以及结合比较流 ...

随机推荐

  1. ES6技术之“判空方案”

    一.常用方案 直接判断 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  2. C语言之基本组成(知识点6)

    一.C程序基本组成 C程序是由语句组成的,通常包括一个或多个函数,其中有且只有一个函数称为 主函数,其函数名为main. 二.C程序的组成特点: 1.每个C程序由一个或多个函数组成.每个C程序有且仅有 ...

  3. 深入解析 float

    0.前言 float属性在css2中是一个热门的属性,被广泛应用于布局之中,同时由于不当使用float带来的问题也非常多,本文结合自己对float的理解以及实际项目中碰到float的相关问题,做一个详 ...

  4. HTML5 Performance

    简介 performance是html5的新特性之一,通过它,页面的开发者们可以非常精确的统计到自己页面的表现情况,从而有针对性的进行优化,提升用户体验. 下面是小姐姐对performance相关AP ...

  5. Java List转为Object组

    代码: private Object[] ListToObject(List<String> list){ Object [] tem = new Object[]{}; int size ...

  6. css实现半圆效果

    效果图: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  7. CTF大赛模拟-CFS三层内网漫游

    CTF大赛模拟-CFS三层内网漫游 环境: 三台虚拟机,三个网络. target 1:192.168.161.178 ,192.168.52.132 (linux) target 2:192.168. ...

  8. numpy教程06---ndarray的进阶操作

    欢迎关注公众号[Python开发实战], 获取更多内容! 工具-numpy numpy是使用Python进行数据科学的基础库.numpy以一个强大的N维数组对象为中心,它还包含有用的线性代数,傅里叶变 ...

  9. 学习打卡day16&&echarts入门

    echarts有两种部署方式,一种是使用CDN命令,将所需文件安装到目标文件中,"npm install echarts --save",适合于已经学习入门了Vue.第二种是在gi ...

  10. 在网站copy时自带的版权小尾巴以及“复制代码“,可以怎么实现

    前言 每天网上的博客各个领域都会涌现新文章,有时候看到感兴趣的知识就想把某段文字 copy下来 摘录下来,等有时间后慢慢品味 在部分网站上,如果只是复制少量文字,并没有什么不同.但是当我们复制的文字多 ...