You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ASP.NET Web API DelegatingHandler中识别HTTPS加密类型

获取ASP.NET Web API中HTTPS加密协议版本的方案

刚好之前在做Web API日志扩展时碰到过一模一样的需求,给你几个实用的方法,都是基于DelegatingHandler里能拿到的对象来实现的:

1. 针对传统ASP.NET Web API(System.Web.Http)

在传统框架里,你可以从HttpRequestMessage的属性中取出HttpContextBase,然后通过服务器变量获取协议信息:

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
    string sslProtocol = null;
    // 获取HttpContext
    var httpContext = request.Properties["MS_HttpContext"] as HttpContextBase;
    if (httpContext?.Request.IsSecureConnection == true)
    {
        // 从ServerVariables中读取加密协议
        sslProtocol = httpContext.Request.ServerVariables["HTTPS_PROTOCOL"];
        // 示例返回值:"TLS/1.2"、"TLS/1.3"
    }

    // 这里添加你的日志逻辑,把sslProtocol记录进去
    var response = await base.SendAsync(request, cancellationToken);
    return response;
}

2. 针对ASP.NET Core Web API

在Core版本中,HttpRequestMessage直接关联了HttpContext,可以更简洁地获取协议枚举:

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
    SslProtocols? sslProtocol = null;
    if (request.HttpContext?.Connection != null && request.HttpContext.Request.IsHttps)
    {
        sslProtocol = request.HttpContext.Connection.SslProtocol;
        // 枚举值转字符串示例:sslProtocol.ToString() → "Tls12"、"Tls13"
    }

    // 执行日志记录
    var response = await base.SendAsync(request, cancellationToken);
    return response;
}

3. 自托管场景(比如OWIN自托管)

如果你的Web API是自托管的,可以通过Owin上下文获取协议信息:

protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
    string sslProtocol = null;
    var owinContext = request.GetOwinContext();
    if (owinContext?.Request.IsSecure == true)
    {
        sslProtocol = owinContext.Request.Environment["ssl_protocol"] as string;
    }

    // 日志逻辑
    var response = await base.SendAsync(request, cancellationToken);
    return response;
}

注意事项

  • 一定要先判断请求是否为HTTPS,非加密请求下这些属性/变量会是null或者SslProtocols.None,避免空引用异常。
  • 不同环境下返回的协议字符串格式可能略有差异,比如有的是TLS/1.2有的是Tls12,你可以根据需求做统一格式化。

内容的提问来源于stack exchange,提问作者Hannes Kindströmmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:45:28