如何在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
相关产品推荐
相关产品推荐

