【ASP.NET Core】如何隐藏响应头中的 “Kestrel”
全宇宙人民都知道,ASP.NET Core 应用是不依赖服务器组件的,因此它可以独立运行,一般是使用支持跨平台的 Kestrel 服务器(当然,在 Windows 上还可以考虑用 HttpSys,但要以管理员身份运行)。
尽管 SDK 文档中推荐我们用服务器组件来“反向”代理,但独立运行也是允许的。当 Web 应用独立运行的时候,客户端发出请求后,在响应的 HTTP 消息中,会附上一个 Server 头,其值就是 Kestrel。如下面的高清无码无水印截图所示。

看到了吧,Server = Kestrel。上面老周做了个小站,并且是独立运行的,但我想隐藏那个 Kestrel 名字,想把它改为 Pig Platform。既然想到了,那就动手,这个其实很好办的,只要在中间件的 HTTP 管道中插入一个自定义的中间件,修改一下 Server 头就行了。
实现方法就是在 Startup 类的 Configure 方法中 Use 一下就好了。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} app.Use(async (context, next) =>
{
context.Response.Headers["Server"] = "Bun Server 2098";
await next();
});
app.UseMvc();
}
因为代码不多,就没必要写中间件类了,直接 Use 方法传委托就OK了。代码固然是全宇宙最简单的,可是,你得注意顺序,啥意思呢,比如我改为这样。
app.Use(async (context, next) =>
{
await next();
context.Response.Headers["Server"] = "Bun Server 2098";
});
这样修改后会出错,因为 next 直接进入下一个中间件,而这“下一个”中间件就可能是 MVC 了,这时候 HTTP 头的集合被锁定,变成只读了,一修改就出错。所以,要在进入下一个中间件之前把 Server 头改掉。
故,这样才不会出错。
context.Response.Headers["Server"] = "Bun Server 2098";
await next();
如此处理后,当客户端访问时,Server 头就变成这样。

效果是做到了,可,这样一来,咱们的 Startup.Configure 方法好像不够简洁。而且,这代码太不够逼格,严重不符合现在年轻人热衷于装逼的时代需求。
为了让其适应一切以装逼为核心的时代精神,我们可以使用 Starup Filter。
看名字你会猜到,是个过滤器,它的作用就是:能把中间件插入到 HTTP 消息管道的最前面,或者最后面。实现 Filter 的方法是实现 IStartupFilter 接口。这个接口只有一个方法。
Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next);
这个方法和 Startup 类中的 Configure 方法很像。参数和返回值都一个带 IApplicationBuilder 参数的委托。方法的 next 参数是下一个要执行的 Configure 方法,可能是下一个 Startup Filter 的 Configure 方法,也可能是 Startup 类的 Configure 方法。返回值就是我们对当前的 Configure 方法的处理。
先看看我的实现。
public class MyStartupFilter : IStartupFilter
{
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
return app =>
{
app.Use(async (context, _next) =>
{
context.Response.Headers.Add("Server", "Big Server");
await _next();
});
next(app);
};
}
}
在这个项目中,除了运行库内部的,外部实现的 Starup Filter 只有一个—— MyStartupFilter ,所以,在 Configure 方法中,参数 next 就是 Startup 类的 Configure 方法。因此,在这里,你可以决定应用程序是否执行 Startup 类中的 Configure 方法。
上面代码的意思就是:先为应用程序注册我们自己的中间件(此处是委托),修改 Server HTTP 头,然后再调用 Startup 类中 Configure 方法。如此就使得我们自定义的中间件代码被入到整个 HTTP 消息管道的前面。
这时候,你可以把 Startup 类中刚刚写的代码删掉了,使用 Configure 方法继续保持简洁。
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} //app.Use(async (context, next) =>
//{
// context.Response.Headers["Server"] = "Bun Server 2098";
// await next();
//});
app.UseMvc();
}
那么这个 Startup Filter 类怎么用呢,好像没有添加的相关 API 。其实,ASP.NET Core 有一个万能法则——依赖注入。当你自己写的任何扩展类型不知道怎么使用时,你就统统放进 ServiceCollection 里面就好了。于是,可以修改 Starup 类的 ConfigureServices 方法。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().WithRazorPagesAtContentRoot().AddRazorPagesOptions(o=>
{
o.Conventions.AddPageRoute("/Main", "");
});
services.AddTransient<IStartupFilter, MyStartupFilter>();
}
ServiceCollection 有三种 Add 方法,用途一样,不同的是对象实例的生命周期。
1、AddSingleton:活得最长,寿与天齐。整个应用程序中它只产生一个实例。
2、AddScoped:寿命稍短,它主要在同一次 HTTP 请求中有效,从收到 HTTP 请求时创建实例,请求结束后销毁实例。
3、AddTransient:这个最短命,用的时候创建实例,用完就扔。
我们这个 Startup Filter 只在应用初始化时用一次,后续不再使用,所以用 AddTransient 方法添加就行了,整个应用中就用一次,没必要占着位置不放。
此时,访问服务器,也能将默认的 Kestrel 修改。

效果一样。
好了,今天就扯到这里,不算什么高大上技巧。
【ASP.NET Core】如何隐藏响应头中的 “Kestrel”的更多相关文章
- 尝新体验ASP.NET Core 6预览版本中发布的最小Web API(minimal APIS)新特性
本文首发于<尝新体验ASP.NET Core 6预览版本中发布的最小Web API(minimal APIS)新特性> 概述 .NET开发者们大家好,我是Rector. 几天前(美国时间2 ...
- 提高安全性而在HTTP响应头中可以使用的各种响应头字段
本文介绍在Web服务器做出响应时,为了提高安全性而在HTTP响应头中可以使用的各种响应头字段.由于部分浏览器中有可能对某些字段或选项不提供支持,所以在使用这些字段时请先确认客户端环境. X-Frame ...
- ASP.NET Core在Azure Kubernetes Service中的部署和管理
目录 ASP.NET Core在Azure Kubernetes Service中的部署和管理 目标 准备工作 注册 Azure 账户 AKS文档 进入Azure门户(控制台) 安装 Azure Cl ...
- 前端必备HTTP技能之HTTP请求头响应头中常用字段详解(转)
作为一名前端开发人员,肯定少不了要和网络打交道,因为要从服务器端拉取数据,从服务端获取数据最常用的方式还是通过HTTP请求.给服务器发请求的时候有请求头,接受服务器响应的时候有响应头,客户端和服务器端 ...
- ASP.NET Core MVC的路由参数中:exists后缀有什么作用,顺便谈谈路由匹配机制
我们在ASP.NET Core MVC中如果要启用Area功能,那么会看到在Startup类的Configure方法中是这么定义Area的路由的: app.UseMvc(routes => { ...
- 你知道 http 响应头中的 ETag 是如何生成的吗
关于 etag 的生成需要满足几个条件 当文件不会更改时,etag 值保持不变.所以不能单纯使用 inode 便于计算,不会特别耗 CPU.这样子 hash 不是特别合适 便于横向扩展,多个 node ...
- 面试官:如果 http 响应头中 ETag 值改变了,是否意味着文件内容一定已经更改
本篇文章由我的 一日一题 中的四个 Issue 组合而成 [Q111]http 响应头中的 ETag 值是如何生成的 [Q112]如果 http 响应头中 ETag 值改变了,是否意味着文件内容一定已 ...
- 【Asp.net Core】在 Linux 子系统中安装 nginx 并配置反向代理
上一篇鸟文中,老周已经介绍过在 Ubuntu 子系统中安装 dotnet-sdk 的方法,本文老周给大伙伴们说说安装 nginx 服务,并配置反向代理.同样,老周假设你从来没有用过 Linux,所以老 ...
- ASP.NET Core 请求/查询/响应参数格式转换(下划线命名)
业务场景: 在 ASP.NET Core 项目中,所有的代码都是骆驼命名,比如userName, UserName,但对于 WebApi 项目来说,因为业务需要,一些请求.查询和响应参数的格式需要转换 ...
随机推荐
- FusionCharts封装-单系列图
ColumnChart.java: /** * @Title:ColumnChart.java * @Package:com.fusionchart.model * @Description:柱形图 ...
- FusionCharts MSBar3D图
1.静态页面 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ...
- Form提交表单页面不跳转
1.设计源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...
- Maven入门(含实例教程)
原文地址:http://blog.csdn.net/u013142781/article/details/50316383 Maven这个个项目管理和构建自动化工具,越来越多的开发人员使用它来管理项目 ...
- PageBase 公共基础类
PageBase 公共基础类 using System; using System.Collections.Generic; using System.Linq; using System.Web; ...
- unity案例入门(二)(坦克大战)
1. 案例简述 这个案例实现一个简单的坦克对战游戏,两个玩家在一个地图上PK. 2. 控制坦克移动 与案例一中小球的移动方式不同,坦克在横向上不能是平移,因此横向按键控制的应该是坦克旋转. publi ...
- canvas实现水波纹效果
本文将会从水波的基本原理开始,详细讲解在canvas中模拟水波扩散,分析并计算水波的能量分布,并通过振幅模拟水波对图像的折射效果,最后实现水波特效. 水波基本原理 首先复习一波高中物理知识. 波是指振 ...
- Luogu P3412 仓鼠找$sugar$ $II$
Luogu P3412 仓鼠找\(sugar\) \(II\) 题目大意: 给定一棵\(n\)个点的树, 仓鼠每次移动都会等概率选择一个与当前点相邻的点,并移动到此点. 现在随机生成一个起点.一个终点 ...
- [Luogu4074][WC2013]糖果公园
BZOJ权限题!提供洛谷链接 sol 树上带修改莫队 很显然吧.对吧. 所以说树上莫队要怎么写呢? 我们知道莫队=给区间排序+依次暴力处理,所以对于树上莫队而言也是一样的. 序列莫队基于序列分块(也就 ...
- 【THUWC 2017】在美妙的数学王国中畅游
数学王国里有n座城市,每座城市有三个参数\(f\),\(a\),\(b\),一个智商为\(x\)的人经过一座城市的获益\(f(x)\)是 若\(f=1\),则\(f(x)=\sin(ax+b)\): ...