言
在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小時內與您取得聯系。