言
在ASP.Net Core2.X调用的CreateWebHostBuilder和3.X的主要区别在于WebHost的调用,CreateDefaultBuilder被Host替换,另一个区别是对ConfigureWebHostDefaults()的调用;
由于新的主机生成器是通用主机生成器,因此我们也需要知道默认Web主机配置默认配置了什么.ConfigureWebHostDefaults为我们默认做了哪些配置?我们一起来看看他为我们默认配置的HostFiltering,HostFilteringMiddleware,其实他做的是对请求主机头的限制,也相当于一个请求主机头白名单,标识着某些主机头你可以访问,其余的你别访问了我这边未允许.
如何使用
在这之初打算的是为给大家分享一下如何配置;算了,我们一起开拓一下思维看看他是如何做的这个中间件吧.顺便再说说当我们使用ASP.NET Core在我们使用中如何配置,使用主机头白名单
services.PostConfigure<HostFilteringOptions>(options=>
{
if (options.AllowedHosts==null || options.AllowedHosts.Count==0)
{
// "AllowedHosts": "localhost;127.0.0.1;[::1]"
var hosts=Configuration["AllowedHosts"]?.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
// Fall back to "*" to disable.
options.AllowedHosts=(hosts?.Length > 0 ? hosts : new[] { "*" });
}
});
HostFilteringOptions
在Configure方法中添加HostFiltering中间件
public void Configure(Microsoft.AspNetCore.Builder.IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseHostFiltering();
app.Run(context=>
{
return context.Response.WriteAsync("Hello World! " + context.Request.Host);
});
}
appsettings.json
{
"AllowedHosts": "127.0.0.1"
}
这样就好了,那么我们再来测试一下看看.
源码解析
/// <summary>
/// Processes requests
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public Task Invoke(HttpContext context)
{
var allowedHosts=EnsureConfigured();//获取允许Host集合
if (!CheckHost(context, allowedHosts))//判断当前Host是否在允许的Host集合中
{
return HostValidationFailed(context);//如果不在400
}
return _next(context);//继续走下一个中间件
}
private Task HostValidationFailed(HttpContext context)
{
context.Response.StatusCode=400;
if (_options.IncludeFailureMessage)
{
context.Response.ContentLength=DefaultResponse.Length;
context.Response.ContentType="text/html";
return context.Response.Body.WriteAsync(DefaultResponse, 0, DefaultResponse.Length);
}
return Task.CompletedTask;
}
private IList<StringSegment> EnsureConfigured()
{
if (_allowAnyNonEmptyHost==true || _allowedHosts?.Count > 0)//判断配置是否为空
{
return _allowedHosts;
}
return Configure();
}
private IList<StringSegment> Configure()
{
var allowedHosts=new List<StringSegment>();
if (_options.AllowedHosts?.Count > 0 && !TryProcessHosts(_options.AllowedHosts, allowedHosts))
{
_logger.WildcardDetected();
_allowedHosts=allowedHosts;
_allowAnyNonEmptyHost=true;
return _allowedHosts;
}
if (allowedHosts.Count==0)//至少一个Host
{
throw new InvalidOperationException("No allowed hosts were configured.");
}
if (_logger.IsEnabled(LogLevel.Debug))
{
_logger.AllowedHosts(string.Join("; ", allowedHosts));
}
_allowedHosts=allowedHosts;
return _allowedHosts;
}
总结
这篇文章主要也许能给大家开阔一下思维,其实他的实现逻辑很简单,当我们请求带着Host头去访问的时候,通过该中间件判断该Host头是否在我们预先配置好的里面,如果在里面那么就继续请求下一个中间件,如果说不在那么不好意思400
PI
来源:快舔包我很肥
框架
WebAPI Contrib:帮助你提高 ASP.NET Web API 能力的开源项目集合。
应用框架(Application Frameworks)
应用模板(Application Templates)
人工智能(Artificial Intelligence)
程序集处理(Assembly Manipulation)
资源(Assets)
认证和授权(Authentication and Authorization)
自动构建(Build Automation)
缓存(Caching)
CLI
CLR
CMS
代码分析和度量(Code Analysis and Metrics)
编译器(Compiler)
压缩(Compression)
持续集成(Continuous Integration)
加密(Cryptography)
数据库(Database)
数据库驱动(Database Drivers)
反编译(Decompilation)
部署(Deployment)
DirectX
分布式计算(Distributed Computing)
文档(Documentation)
电子商务和支付(E-Commerce and Payments)
环境管理(Environment Management)
ETL
游戏(Game)
地理信息系统(Gis)
Git工具(Git Tools)
图形(Graphics)
GUI
HTML 和 CSS(HTML and CSS)
HTTP
IDE
图像处理(Image Processing)
安装工具(Install Tools)
国际化(Internationalization)
互操作(Interoperability)
IoC
日志(Logging)
机器学习和数据科学(Machine Learning and Data Science)
Markdown 处理(Markdown Processors)
邮件(Mail)
数学(Mathematics)
多媒体(Media)
度量(Metrics)
微框架(Micro Framework)
杂项(Misc)
MVVM
Office
ORM
包管理(Package Management)
Profiler
推送通知(Push Notifications)
队列(Queue)
响应式编程(Reactive Programming)
计划调度(Scheduling)
SDK 和 API 客户端(SDK and API Clients)
搜索(Search)
序列化(Serialization)
状态机(State machines)
静态网站生成(Static Site Generators)
风格指南(Style Guide)
模板引擎(Template Engine)
测试(Testing)
交易(Trading)
Visual Studio 插件(Visual Studio Plugins)
Web 框架(Web Frameworks)
Web 服务器(Web Servers)
WebSocket
Windows 服务(Windows Services)
通讯框架(Communication Frameworks)
其他列表(Other Lists)
看完本文有收获?请转发分享给更多人!!!欢迎大家点赞,留言讨论,喜欢这篇文章可以分享给更多人,关注我每天更新分享有关程序员、科技、编程之类的文章!!!爱你们,,么么哒,,让我们一起愉快的玩耍把!!!
spcms,是完全开源的一套CMS建站系统,主要面向个人或者企业进行快速的建造简洁,高效,易用,安全的网站,Aspcms让一般的开发人员就能够使用Aspcms以最低的成本、最少的人力投入在最短的时间内架设一个功能齐全、性能优异的网站。Aspcms是基于ASP+Access(sql2000)开发的网站内容管理系统,提供了简介类模块,新闻类模块,产品类模块,图片类模块,下载类模块。站长在使用过程中可选择任意模块来建设自己的网站。
Aspcms的适用性:充分考虑网站搭建的实际需要,确保功能上较强的实用性。Aspcms易用性:用户界面简洁、美观、友好,易于用户操作和使用,操作人员只需简单学习即可掌握,降低学习成本。Aspcms的安全性:安全可靠的权限划分,既考虑信息的共享,又注意信息的保护与隔离。
Aspcms搭建的网站可以一键生成html,自动完成地图生成;RSS生成,并且Aspcms还可以URL自定义,同时Aspcms增加按指定日期生成内容的功能。并且Aspcms搭建的站点可以自定义生成目录、文件名称,站长可以自己分类自定义模板、内容自定义模板、分类访问权限控制。
Aspcms能够自动一键切换模板,并且还有模板防盗功能,进行在线修改模板,CSS文件。Aspcms的功能点:采集功能、TAG功能、批量添加分类功能、水印功能、留言,评论内容过滤功能。Aspcms自动在线升级再加上了事件邮件提醒。
站长可以自定义标签和展示位管理,并且站长可以无限极分类,站长可以通过Aspcms自定义标题、自定义关键词、自定义描述。网站的栏目,分类是否启用开关,加上对外部跳转链接、友情链接控制,站长可以上传文件管理,数据库备份/恢复,幻灯片等网站常用功能,并且可以对冗余文件检测功能,可以检测无用的上传文件并删除,这样就可以对Aspcms网站进行全方位的管理。
给大家分享一下使用Aspcms搭建网站的方法:
首先,在本地主机上安装IIS服务;
IIS服务安装好后,进入IIS管理器;
点击IIS管理器中的asp选项,将将错误发生到浏览器和启用父路径后面的选项修改为True;
进入高级设置选项,在物理路径中添加网站文化的保存路径;
最后,在浏览器中输入localhost即可访问网站;
Aspcms对环境的要求极低、凡支持IIS的空间或服务器均可运行,只需要上传程序到你的网站根目录中(注意:不支持二级目录),然后修改网站目录下的数据库目录(Aspcms_data)的权限,增加Internet 来宾帐户的修改写入权限。这样一个Aspcms的网站就可以很快速的搭建起来了,是不是非常的简单呢。
*请认真填写需求信息,我们会在24小时内与您取得联系。