最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解ASP.NET?Core高性能服務(wù)器HTTP.SYS

 更新時(shí)間:2022年04月06日 12:02:48   作者:Artech  
HTTP.SYS本質(zhì)上就是一個(gè)HTTP/HTTPS監(jiān)聽器,它是Windows網(wǎng)絡(luò)子系統(tǒng)的一部分,是一個(gè)在內(nèi)核模式下運(yùn)行的網(wǎng)絡(luò)驅(qū)動,今天通過本文給大家介紹下ASP.NET?Core高性能服務(wù)器HTTP.SYS,感興趣的朋友一起看看吧

如果我們只需要將ASP.NET CORE應(yīng)用部署到Windows環(huán)境下,并且希望獲得更好的性能,那么我們選擇的服務(wù)器類型應(yīng)該是HTTP.SYS。Windows環(huán)境下任何針對HTTP的網(wǎng)絡(luò)監(jiān)聽器/服務(wù)器在性能上都無法與HTTP.SYS比肩。

一、HTTP.SYS簡介

HTTP.SYS本質(zhì)上就是一個(gè)HTTP/HTTPS監(jiān)聽器,它是Windows網(wǎng)絡(luò)子系統(tǒng)的一部分,是一個(gè)在內(nèi)核模式下運(yùn)行的網(wǎng)絡(luò)驅(qū)動。HTTP.SYS對應(yīng)的驅(qū)動文件為“%WinDir\System32\drivers\http.sys”,不要小看這個(gè)只有1M多的文件,Windows系統(tǒng)針對HTTP的監(jiān)聽、接收、轉(zhuǎn)發(fā)和響應(yīng)大都依賴它。如圖1所示,HTTP.SYS建立在Windows網(wǎng)絡(luò)子系統(tǒng)針對TCPIP協(xié)議棧的驅(qū)動(TCPIP.SYS)之上,并為用戶態(tài)運(yùn)行的IIS提供基礎(chǔ)的HTTP通信服務(wù)。前面我們使用的HttpListener也建立在HTTP.SYS上面。

圖1 HTTP.SYS

由于HTTP.SYS是在操作系統(tǒng)內(nèi)核態(tài)運(yùn)行,所以它提供的性能優(yōu)勢是其他在用戶態(tài)運(yùn)行的同類產(chǎn)品無法比擬的。由于它自身提供響應(yīng)緩存,所以在緩存命中的情況下根本不需要與用戶態(tài)進(jìn)程進(jìn)行交互。它還提供了請求隊(duì)列(Request Queue),如果請求的目標(biāo)進(jìn)程(比如IIS的工作進(jìn)程)處于活動狀態(tài),它可以直接將請求分它給它,否則請求會暫存于隊(duì)列中等待目標(biāo)進(jìn)程來提取,這樣的工作模式既減少了內(nèi)核態(tài)與用戶態(tài)之間的上下文切換,也確保請求不會丟失。HTTP.SYS還提供連接管理,流量限制,診斷日志等功能,并提供針對Kerberos的Windows認(rèn)證。

由于HTTP.SYS是一個(gè)底層共享的網(wǎng)絡(luò)驅(qū)動,它有效地解決了端口共享的問題。用戶態(tài)進(jìn)程會使用地址前綴(含端口號)“接入”HTTP.SYS,后者利用提供的地址前綴來轉(zhuǎn)發(fā)請求,多個(gè)用戶態(tài)進(jìn)程只要保證提供的地址前綴不同就可以了,所以它們可以使用相同的端口號。端口共享使每個(gè)用戶進(jìn)程都可以使用標(biāo)準(zhǔn)的80/443端口。

二、MessagePump & UseHttpSys

基于HTTP.SYS的服務(wù)器體現(xiàn)為如下這個(gè)MessagePump類型,它內(nèi)部使用一個(gè)HttpSysListener對象采用注冊的監(jiān)聽地址接入HTTP.SYS。MessagePump提供針對HTTP 1.X、HTTP 2以及HTTPS的支持。對于Windows Server 2022和Windows 11,還支持HTTP 3。IWebHostBuilder接口如下這兩個(gè)UseHttpSys擴(kuò)展方法用來完成針對MessagePump的注冊。

internal class MessagePump : IServer, IDisposable
{
     internal HttpSysListener Listener { get; }
     public IFeatureCollection Features { get; }
     public MessagePump(IOptions<HttpSysOptions> options, ILoggerFactory loggerFactory,IAuthenticationSchemeProvider authentication);
     public Task StartAsync<TContext>(IHttpApplication<TContext> application,CancellationToken cancellationToken);
     public Task StopAsync(CancellationToken cancellationToken);
     public void Dispose();
}
public static class WebHostBuilderHttpSysExtensions
{
    [SupportedOSPlatform("windows")]
    public static IWebHostBuilder UseHttpSys(this IWebHostBuilder hostBuilder);

    [SupportedOSPlatform("windows")]
    public static IWebHostBuilder UseHttpSys(this IWebHostBuilder hostBuilder,Action<HttpSysOptions> options);
}

如下所示的是在Minimal API下調(diào)用UseHttpSys注冊MessagePump 服務(wù)器的例子。

var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys();
var app = builder.Build();
app.MapGet("/", () => "Hello World");
app.Run();

三、HttpSysOptions

在調(diào)用UseHttpSys擴(kuò)展方法注冊基于HTTP.SYS的MessagePump服務(wù)器的時(shí)候,我們可以利用提供的Action<HttpSysOptions>委托對相關(guān)的配置選項(xiàng)進(jìn)行設(shè)置。HttpSysOptions的UrlPrefixes屬性返回注冊的監(jiān)聽地址前綴,但是最終是否這種直接注冊到服務(wù)器上的監(jiān)聽器地址,取決于IServerAddressesFeature特性的PreferHostingUrls屬性,這一點(diǎn)與KestrelServer是一致的。

public class HttpSysOptions
{
    public UrlPrefixCollection 	        UrlPrefixes { get; }
    public RequestQueueMode 		RequestQueueMode { get; set; }
    public string? 			RequestQueueName { get; set; }
    public long 			RequestQueueLimit { get; set; }
    public AuthenticationManager 	Authentication { get; }
    public ClientCertificateMethod 	ClientCertificateMethod { get; set; }
    public long? 			MaxConnections { get; set; }
    public long? 			MaxRequestBodySize { get; set; }
    public int 			        MaxAccepts { get; set; }
    public Http503VerbosityLevel 	Http503Verbosity { get; set; }
    public TimeoutManager 		Timeouts { get; }
    public bool 			AllowSynchronousIO { get; set; }
    public bool 			EnableResponseCaching { get; set; }
    public bool 			ThrowWriteExceptions { get; set; }
    public bool 			UnsafePreferInlineScheduling { get; set; }
    public bool 			UseLatin1RequestHeaders { get; set; }
}

HTTP.SYS利用請求隊(duì)列來存放待處理的請求,我們可以利用RequestQueueMode屬性決定創(chuàng)建一個(gè)新的隊(duì)列或者使用現(xiàn)有的隊(duì)列。該屬性類型為如下這個(gè)RequestQueueMode枚舉,枚舉項(xiàng)Create表示創(chuàng)建新的隊(duì)列,Attach表示使用現(xiàn)有的以RequestQueueName屬性命名的對象,如果該隊(duì)列不存在會拋出異常。CreateOrAttach提供了一個(gè)折中方案,如果指定名稱的隊(duì)列不存在就創(chuàng)建一個(gè)以此命名的新隊(duì)列。該屬性的默認(rèn)值為Create,RequestQueueName屬性默認(rèn)值為Null(代表匿名隊(duì)列),RequestQueueLimit屬性表示隊(duì)列的容量,默認(rèn)值為1000。HttpSysOptions承載的很多配置選項(xiàng)只會應(yīng)用到新創(chuàng)建的請求隊(duì)列上。

public enum RequestQueueMode
{
    Create,
    Attach,
    CreateOrAttach
}

HttpSysOptions的Authentication屬性返回一個(gè)AuthenticationManager對象,我們利用它完成針對認(rèn)證的設(shè)置。我們可以利用Schemes屬性設(shè)置認(rèn)證方案,該屬性默認(rèn)為None。如果不允許匿名訪問,可以將AllowAnonymous屬性設(shè)為False。如果將AutomaticAuthentication屬性返回True(默認(rèn)值),認(rèn)證用戶將自動賦值給HttpContext上下文的User屬性。AuthenticationDisplayName屬性用來為認(rèn)證方案提供一個(gè)顯示名稱。

public sealed class AuthenticationManager
{
    public AuthenticationSchemes 	Schemes { get; set; }
    public bool 			AllowAnonymous {get; set; }
    public bool 			AutomaticAuthentication { get; set; }
    public string? 			AuthenticationDisplayName { get; set; }
}

[Flags]
public enum AuthenticationSchemes
{
    None 				= 0x0,
    Digest 				= 0x1,
    Negotiate 				= 0x2,
    Ntlm 				= 0x4,
    Basic 				= 0x8,
    Anonymous 				= 0x8000,
    IntegratedWindowsAuthentication 	= 0x6
}

HTTPS站點(diǎn)可以要求提供證書來對其實(shí)施認(rèn)證,HttpSysOptions的ClientCertificateMethod屬性用于設(shè)置請求客戶端證書的方式,該屬性返回如下這個(gè)ClientCertificateMethod枚舉。在.NET 5之前,客戶端證書采用Renegotation的方式來提取的,Renegotiation是在已經(jīng)建立的SSL/TLS連接上再次發(fā)起的一輪“協(xié)商握手”,這種方式對應(yīng)AllowRenegotation枚舉項(xiàng)。由于可能帶來一些性能和死鎖的問題,這種方式在.NET 5之后已經(jīng)默認(rèn)禁止了,目前默認(rèn)的方式是創(chuàng)建SSL/TLS連接的初始階段就提取該證書,這種方式對應(yīng)AllowRenegotation枚舉項(xiàng),這也是ClientCertificateMethod屬性的默認(rèn)值。

public enum ClientCertificateMethod
{
    NoCertificate,
    AllowCertificate,
    AllowRenegotation
}

HttpSysOptions的MaxConnections和MaxRequestBodySize屬性分別表示最大連接數(shù)和請求主體內(nèi)容的最大字節(jié)數(shù),如果它們被設(shè)置為Null,意味著忽略對應(yīng)的限制。這兩個(gè)屬性的默認(rèn)值分別Null和30,000,000。MaxAccepts屬性表示接受的最大并發(fā)請求,默認(rèn)值為當(dāng)前處理器數(shù)量的5倍。如果并發(fā)請求數(shù)量超過限流設(shè)置,后續(xù)請求會拒絕處理,此時(shí)服務(wù)器會直接回復(fù)一個(gè)狀態(tài)碼為503的響應(yīng),與此同時(shí)還會根據(jù)Http503Verbosity屬性設(shè)置的等級作相應(yīng)的處理。如果該屬性值為Basic(默認(rèn)值),當(dāng)前TCP連接會重置,F(xiàn)ull和Limitmed選項(xiàng)會影響響應(yīng)的狀態(tài)描述,前者返回詳細(xì)的Reason Phrase,后者采用標(biāo)準(zhǔn)的“Service Unavailable”。

public enum Http503VerbosityLevel
{
    Basic,
    Limited,
    Full
}

HttpSysOptions的Timeouts屬性返回如下這個(gè)TimeoutManager對象,我們利用它完成各種超時(shí)設(shè)置,包括請求主體內(nèi)容抵達(dá)時(shí)間(EntityBody)、讀取請求主體內(nèi)容時(shí)間(DrainEntityBody),請求在隊(duì)列中存放的時(shí)間(RequestQueue)、連接閑置時(shí)間(IdleConnection)和解析請求報(bào)頭時(shí)間(HeaderWait),這些超時(shí)時(shí)間默認(rèn)都是兩分鐘。MinSendBytesPerSecond屬性表示響應(yīng)數(shù)據(jù)的最小發(fā)送率,默認(rèn)為每秒150字節(jié)。

public sealed class TimeoutManager
{
    public TimeSpan 	EntityBody { get; set; }
    public TimeSpan 	DrainEntityBody { get; set; }
    public TimeSpan 	RequestQueue { get; set; }
    public TimeSpan 	IdleConnection { get; set; }
    public TimeSpan 	HeaderWait { get; set; }
    public long 	MinSendBytesPerSecond { get; set; }
}

HttpSysOptions還定義了其他一系列屬性。AllowSynchronousIO屬性(默認(rèn)為False)表示是否運(yùn)行以同步IO的方式完成針對請求和響應(yīng)主體內(nèi)容的讀寫。EnableResponseCaching屬性(默認(rèn)為True)表示允許響應(yīng)緩存。ThrowWriteExceptions屬性(默認(rèn)為False)表示因斷開連接導(dǎo)致寫入響應(yīng)主體內(nèi)容失敗是否需要拋出異常。如果將UnsafePreferInlineScheduling(默認(rèn)為False)設(shè)置為True,意味著會直接在讀取請求的IO線程中執(zhí)行后續(xù)的應(yīng)用代碼,否則我們編寫的應(yīng)用代碼會分發(fā)到線程池中進(jìn)行處理。這樣可以通過避免線程切換減少單個(gè)請求的處理耗時(shí),但是會對整體的吞吐量帶來負(fù)面影響。UseLatin1RequestHeaders屬性(默認(rèn)為False)表示是否采用Latin1字符集(ISO-8859-1)對請求報(bào)頭進(jìn)行編碼。

到此這篇關(guān)于ASP.NET Core高性能服務(wù)器HTTP.SYS的文章就介紹到這了,更多相關(guān)ASP.NET Core高性能服務(wù)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JWT+Log4net配置與使用詳解

    JWT+Log4net配置與使用詳解

    這篇文章主要介紹了JWT+Log4net配置與使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-07-07
  • .Net Core簡單使用Mvc內(nèi)置的Ioc(續(xù))

    .Net Core簡單使用Mvc內(nèi)置的Ioc(續(xù))

    怎樣直接獲取Ioc中的實(shí)例對象,而不是以構(gòu)造函數(shù)的方式進(jìn)行獲取呢?這篇文章繼續(xù)為大家介紹.Net Core簡單使用Mvc內(nèi)置的Ioc
    2018-03-03
  • ASP.NET 頁面間數(shù)據(jù)傳遞方法小結(jié)

    ASP.NET 頁面間數(shù)據(jù)傳遞方法小結(jié)

    Web 頁面是無狀態(tài)的, 服務(wù)器對每一次請求都認(rèn)為來自不同用戶,因此,變量的狀態(tài)在連續(xù)對同一頁面的多次請求之間或在頁面跳轉(zhuǎn)時(shí)不會被保留。
    2009-12-12
  • 用WPF實(shí)現(xiàn)屏幕文字提示的實(shí)現(xiàn)方法

    用WPF實(shí)現(xiàn)屏幕文字提示的實(shí)現(xiàn)方法

    本文介紹WPF應(yīng)用程序?qū)崿F(xiàn)在屏幕上顯示一行或多行文字通知。它沒有標(biāo)題欄和最大化最小化等按鈕,可以有半透明背景以使文字的顯示更清晰,鼠標(biāo)點(diǎn)擊后提示消失。
    2013-07-07
  • Jwt通過源碼揭秘隱藏大坑

    Jwt通過源碼揭秘隱藏大坑

    今天分享一下在使用JWT在項(xiàng)目中遇到的一個(gè)問題,主要是一個(gè)協(xié)議的細(xì)節(jié),非常容易被忽略,如果不是自己遇到,或者去看源碼的實(shí)現(xiàn),我估計(jì)至少80%的人都會栽在這里,下面來還原一下這個(gè)問題的過程,由于這個(gè)問題出現(xiàn)有一定的概率,不是每次都會出現(xiàn),所以才容易掉坑里
    2022-05-05
  • ASP.NET使用正則表達(dá)式屏蔽垃圾信息

    ASP.NET使用正則表達(dá)式屏蔽垃圾信息

    找資料,看看如何實(shí)現(xiàn)使用正則表達(dá)式屏蔽垃圾信息,找來找去找出來的都不怎么好,有不詳細(xì)的,有代碼缺失的。最后還是找到了微軟,先摘過來,大概思路已經(jīng)有了,只需把下面微軟給的樣例代碼修改一下即可,具體能不能行還不知道,先睡一覺,起來再慢慢研究。
    2008-09-09
  • ASP.net 頁面被關(guān)閉后,服務(wù)器端是否仍然執(zhí)行中?

    ASP.net 頁面被關(guān)閉后,服務(wù)器端是否仍然執(zhí)行中?

    當(dāng)一個(gè)正在執(zhí)行中的ASPX頁面執(zhí)行到一半的時(shí)候,瀏覽器中你關(guān)閉了這個(gè)頁面,服務(wù)器端對應(yīng)的這個(gè)頁面的代碼仍然在執(zhí)行么?
    2008-08-08
  • 值類型和引用類型的區(qū)別深入理解

    值類型和引用類型的區(qū)別深入理解

    值類型通常被分配在棧上,它的變量直接包含變量的實(shí)例,使用效率比較高;引用類型分配在托管堆上,引用類型的變量通常包含一個(gè)指向?qū)嵗闹羔?,變量通過該指針來引用實(shí)例,需要的朋友可以了解下
    2012-12-12
  • SignalR Self Host+MVC等多端消息推送服務(wù)(三)

    SignalR Self Host+MVC等多端消息推送服務(wù)(三)

    這篇文章主要為大家詳細(xì)介紹了SignalR Self Host+MVC等多端消息推送服務(wù)的第三篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 解決 .NET Core 中 GetHostAddressesAsync 引起的 EnyimMemcached 死鎖問題

    解決 .NET Core 中 GetHostAddressesAsync 引起的 EnyimMemcached 死鎖問題

    這篇文章主要介紹了解決 .NET Core 中 GetHostAddressesAsync 引起的 EnyimMemcached 死鎖問題的相關(guān)資料,需要的朋友可以參考下
    2016-09-09

最新評論

宁武县| 廉江市| 诸暨市| 喜德县| 于都县| 澎湖县| 额济纳旗| 青州市| 汾阳市| 石狮市| 舞阳县| 那坡县| 安庆市| 黑河市| 昂仁县| 康马县| 镇江市| 澄迈县| 阿拉善右旗| 咸阳市| 虞城县| 宜丰县| 酉阳| 绥中县| 邮箱| 邓州市| 东莞市| 吉安县| 清远市| 喀喇| 中山市| 三河市| 景宁| 黔南| 盐池县| 江达县| 琼中| 个旧市| 宜良县| 嵩明县| 浦北县|