8.6traceparent 与 Content-Type
在发起 HTTP 远程请求时,默认情况下,当前的 Activity 所包含的分布式跟踪上下文(如 traceparent 和 tracestate)会被自动注入到请求的 HTTP 标头中。这一机制有助于下游服务正确识别并关联到同一分布式跟踪链路。
禁用分布式跟踪上下文(traceparent 标头)#
在发起 HTTP 远程请求时,默认情况下,当前的 Activity 所包含的分布式跟踪上下文(如 traceparent 和 tracestate)会被自动注入到请求的 HTTP 标头中。这一机制有助于下游服务正确识别并关联到同一分布式跟踪链路。
如果出于某些业务或安全需求,需要禁用该自动注入行为,可以通过以下代码进行配置:
// 配置默认客户端services.AddHttpClient(string.Empty, client => { }) .ConfigurePrimaryHttpMessageHandler(() => new SocketsHttpHandler() { ActivityHeadersPropagator = null // 禁用分布式上下文传播,或使用 DistributedContextPropagator.CreateNoOutputPropagator() });通过将 ActivityHeadersPropagator 设置为 null,可阻止运行时自动将当前活动的分布式跟踪信息注入到 HTTP 请求头中,从而实现对跟踪上下文传播的控制。相关 Issue 了解:#109558,#90407,#IC7ZZS。
设置 Content-Type(MIME)#
在发送 HTTP 远程请求时,如果请求中包含数据体,通常需要正确设置 Content-Type 请求头,以指明发送内容的 MIME 类型,例如 application/json 或 application/x-www-form-urlencoded。
手动输入 MIME 类型容易拼写错误,从而引发潜在问题。为避免此类错误,推荐使用框架提供的 MediaTypeNames 静态类,该类封装了常用的标准 MIME 类型常量,能够有效提升代码的可读性和健壮性。
以下是使用 MediaTypeNames 设置 Content-Type 的示例代码:
HttpRequestBuilder.Get("https://furion.net/") .SetContentType(MediaTypeNames.Text.Plain); // text/plainHttpRequestBuilder.Post("https://furion.net/") .SetContentType(MediaTypeNames.Application.Json); // application/jsonHttpRequestBuilder.Post("https://furion.net/") .SetContentType(MediaTypeNames.Application.FormUrlEncoded); // application/x-www-form-urlencoded通过上述方式设置 Content-Type,不仅避免了手动输入错误,还能提升开发效率与代码可维护性。