8.6traceparent 与 Content-Type

在发起 HTTP 远程请求时,默认情况下,当前的 Activity 所包含的分布式跟踪上下文(如 traceparent 和 tracestate)会被自动注入到请求的 HTTP 标头中。这一机制有助于下游服务正确识别并关联到同一分布式跟踪链路。

禁用分布式跟踪上下文(traceparent 标头)#

在发起 HTTP 远程请求时,默认情况下,当前的 Activity 所包含的分布式跟踪上下文(如 traceparenttracestate)会被自动注入到请求的 HTTP 标头中。这一机制有助于下游服务正确识别并关联到同一分布式跟踪链路。

如果出于某些业务或安全需求,需要禁用该自动注入行为,可以通过以下代码进行配置:

csharp
// 配置默认客户端services.AddHttpClient(string.Empty, client => { })    .ConfigurePrimaryHttpMessageHandler(() => new SocketsHttpHandler()    {        ActivityHeadersPropagator = null // 禁用分布式上下文传播,或使用 DistributedContextPropagator.CreateNoOutputPropagator()    });

通过将 ActivityHeadersPropagator 设置为 null,可阻止运行时自动将当前活动的分布式跟踪信息注入到 HTTP 请求头中,从而实现对跟踪上下文传播的控制。相关 Issue 了解:#109558#90407#IC7ZZS

设置 Content-TypeMIME#

在发送 HTTP 远程请求时,如果请求中包含数据体,通常需要正确设置 Content-Type 请求头,以指明发送内容的 MIME 类型,例如 application/jsonapplication/x-www-form-urlencoded

手动输入 MIME 类型容易拼写错误,从而引发潜在问题。为避免此类错误,推荐使用框架提供的 MediaTypeNames 静态类,该类封装了常用的标准 MIME 类型常量,能够有效提升代码的可读性和健壮性。

以下是使用 MediaTypeNames 设置 Content-Type 的示例代码:

cs
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,不仅避免了手动输入错误,还能提升开发效率与代码可维护性。