事件
Power BI DataViz World Championships
2月14日 下午4時 - 3月31日 下午4時
4 次參賽機會,有機會贏得會議套裝行程,現場參與在拉斯維加斯舉行的總決賽
進一步了解備註
這不是這篇文章的最新版本。 如需目前的版本,請參閱 本文的 .NET 9 版本。
警告
不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支持原則。 如需目前的版本,請參閱 本文的 .NET 9 版本。
作者:Tom Dykstra 和 Chris Ross
HTTP.sys 是只在 Windows 上執行的 ASP.NET Core 網頁伺服器。 HTTP.sys 是 Kestrel 伺服器的替代方案,可提供一些 Kestrel 未具備的功能。
重要
HTTP.sys 與 ASP.NET Core 模組不相容,且不能與 IIS 或 IIS Express 搭配使用。
HTTP.sys 支援下列功能:
支援的 Windows 版本:
檢視或下載範例程式碼 \(英文\) (如何下載)
HTTP.sys 在下列部署環境中非常有用:
需要直接向網際網路公開伺服器而不使用 IIS。
內部部署需要 Kestrel 中未提供的功能。 如需詳細資訊,請參閱 Windows 索引標籤中的 Kestrel 與HTTP.sys
HTTP.sys 是成熟的技術,可抵禦許多種類的攻擊,並提供功能完整之網頁伺服器的穩固性、安全性及延展性。 IIS 本身在 HTTP.sys 之上以 HTTP 接聽程式的形式執行。
如果符合下列基本需求,即可針對 ASP.NET Core 應用程式啟用 HTTP/2:
如果已建立 HTTP/2 連線,HttpRequest.Protocol 會報告 HTTP/2
。
HTTP/2 預設為啟用。 如果 HTTP/2 連線尚未建立,連線會退為 HTTP/1.1。 Windows 的未來版本會推出 HTTP/2 設定旗標,包括使用 HTTP.sys 來停用 HTTP/2 的功能。
如果符合下列基本需求,即可針對 ASP.NET Core 應用程式啟用 HTTP/3:
https
URL 繫結。上述 Windows 11 組建版本可能需要使用 Windows 測試人員組建。
HTTP/3 會透過 alt-svc
標頭探索為從 HTTP/1.1 或 HTTP/2 的升級。 這表示第一個要求通常會在切換至 HTTP/3 之前使用 HTTP/1.1 或 HTTP/2。 Http.Sys 並不會自動新增 alt-svc
標頭,必須是由應用程式加以新增。 下列程式碼是新增 alt-svc
回應標頭的中介軟體範例。
app.Use((context, next) =>
{
context.Response.Headers.AltSvc = "h3=\":443\"";
return next(context);
});
提早將上述程式碼放在要求管線中。
IIS 也支援傳送 AltSvc HTTP/2 通訊協定訊息 (而不是回應標頭),來通知用戶端指出 HTTP/3 可供使用。 請參閱 EnableAltSvc 登錄機碼。 這需要使用主機名稱而非 IP 位址的 netsh sslcert 繫結。
HTTP.sys 使用 Kerberos 驗證通訊協定委派給核心模式驗證。 Kerberos 和 HTTP.sys 不支援使用者模式驗證。 必須使用電腦帳戶來解密 Kerberos 權杖/票證,該權杖/票證取自 Active Directory,並由用戶端將其轉送至伺服器來驗證使用者。 請註冊主機的服務主體名稱 (SPN),而非應用程式的使用者。
在某些情況下,具有高延遲的大量小型寫入可能會對 HTTP.sys
造成顯著的效能影響。 這項影響是因為 Pipe 實作中缺少 HTTP.sys
緩衝區。 為了提升這些案例中的效能,HTTP.sys
中包含了對回應緩衝的支援。 將 HttpSysOptions.EnableKernelResponseBuffering 設定為 true
,以啟用緩衝處理。
回應緩衝處理應該由執行同步 I/O 或非同步 I/O 的應用程式啟用,且一次不超過一個未處理的寫入。 在這些案例中,回應緩衝可大幅改善高延遲連線的輸送量。
使用非同步 I/O 且一次可能有多個未完成寫入的應用程式不應該使用此旗標。 啟用此旗標可能會導致 HTTP.Sys 的 CPU 和記憶體使用量較高。
建置主機時,呼叫 UseHttpSys 擴充方法,並指定任何必要的 HttpSysOptions。 下列範例會將選項設定為它們的預設值:
using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Hosting.Server.Features;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys(options =>
{
options.AllowSynchronousIO = false;
options.Authentication.Schemes = AuthenticationSchemes.None;
options.Authentication.AllowAnonymous = true;
options.MaxConnections = null;
options.MaxRequestBodySize = 30_000_000;
options.UrlPrefixes.Add("http://localhost:5005");
});
builder.Services.AddRazorPages();
var app = builder.Build();
其他的 HTTP.sys 設定則透過登錄設定處理。
如需 HTTP.sys 選項的詳細資訊,請參閱 HttpSysOptions。
MaxRequestBodySize
任何要求所允許的大小上限 (以位元組為單位)。 當設定為 null
時,要求主體大小上限為無限制。 此限制對升級連線不會有任何影響,因為其一律為無限制。
在 ASP.NET Core MVC 應用程式中針對單一 IActionResult
覆寫限制的建議方式,是在動作方法上使用 RequestSizeLimitAttribute 屬性:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
如果應用程式已開始讀取要求之後,才嘗試設定要求的限制,則會擲回例外狀況。
IsReadOnly
屬性可用來指出 MaxRequestBodySize
屬性是否處於唯讀狀態,代表要設定限制已經太遲。
如果應用程式應該覆寫每個要求的 MaxRequestBodySize,請使用 IHttpMaxRequestBodySizeFeature:
app.Use((context, next) =>
{
context.Features.GetRequiredFeature<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var server = context.RequestServices
.GetRequiredService<IServer>();
var serverAddressesFeature = server.Features
.GetRequiredFeature<IServerAddressesFeature>();
var addresses = string.Join(", ", serverAddressesFeature.Addresses);
var loggerFactory = context.RequestServices
.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
logger.LogInformation("Addresses: {addresses}", addresses);
return next(context);
});
如果您使用 Visual Studio,請確定應用程式未設定為執行 IIS 或 IIS Express。
在 Visual Studio 中,預設啟動設定檔適用於 IIS Express。 若要以主控台應用程式的形式執行專案,請手動變更選取的設定檔,如下列螢幕擷取畫面所示:
判斷要為應用程式開啟的連接埠,然後使用 Windows 防火牆或 New-NetFirewallRule PowerShell Cmdlet 來開啟防火牆連接埠,以允許流量到達 HTTP.sys。 在下列命令和應用程式設定中,會使用連接埠 443。
部署至 Azure VM 時,請在網路安全性群組中開啟連接埠。 在下列命令和應用程式設定中,會使用連接埠 443。
視需要取得並安裝 X.509 憑證。
在 Windows 上,請使用 New-SelfSignedCertificate PowerShell Cmdlet 來建立自我簽署的憑證。 如需不支援的範例,請參閱 UpdateIISExpressSSLForChrome.ps1 \(英文\)。
將自我簽署的憑證或 CA 簽署的憑證安裝在伺服器的 [本機電腦]>個人 存放區中。
如果應用程式是與架構相依的部署,請安裝 .NET Core、.NET Framework 或兩者 (如果應用程式是以 .NET Framework 為目標的 .NET Core 應用程式)。
如果應用程式是自封式部署,則應用程式的部署中會包含執行階段。 不需要在伺服器上安裝任何架構。
設定應用程式中的 URL 和連接埠。
ASP.NET Core 預設會繫結至 http://localhost:5000
。 若要設定 URL 首碼和連接埠,選項包括:
urls
命令列引數ASPNETCORE_URLS
環境變數下列程式碼範例示範如何使用 UrlPrefixes 搭配位於連接埠 443 的伺服器本機 IP 位址 10.0.0.4
:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys(options =>
{
options.UrlPrefixes.Add("https://10.0.0.4:443");
});
builder.Services.AddRazorPages();
var app = builder.Build();
UrlPrefixes
的優點是針對錯誤格式的前置詞會立即產生錯誤訊息。
UrlPrefixes
中的設定會覆寫 UseUrls
/urls
/ASPNETCORE_URLS
設定。 因此,UseUrls
、urls
和 ASPNETCORE_URLS
環境變數的優點,是能更輕鬆地在 Kestrel 和 HTTP.sys 之間切換。
HTTP.sys 會在 URL 前置詞中辨識兩種類型的萬用字元:
*
是弱式繫結,也稱為後援繫結。 如果 URL 前置詞為 http://*:5000
,且其他項目繫結至連接埠 5000,則不會使用此繫結。+
是強式繫結。 如果 URL 前置詞是 http://+:5000
,此繫結將會在其他連接埠 5000 繫結之前使用。如需詳細資訊,請參閱 UrlPrefix 字串。
警告
請http://*:80/
使用最上層萬用字元繫結 (http://+:80
與 )。 最上層萬用字元繫結會導致應用程式安全性弱點。 這對強式與弱式萬用字元皆適用。 請使用明確的主機名稱或 IP 位址,而不要使用萬用字元。 若您擁有整個父網域 (相對於有弱點的 *.mysub.com
) 的控制權,則子網域萬用字元繫結 (例如 *.com
) 便不構成安全性風險。 如需詳細資訊,請參閱 RFC 9110:第 7.2 節:主機和 :authority。
應用程式和容器通常只被分配一個連接埠來接聽,例如埠 80,而不需要像主機或路徑這樣的額外限制。 HTTP_PORTS 和 HTTPS_PORTS 是組態索引鍵,用於指定 Kestrel 和 HTTP.sys 伺服器的接聽連接埠。 這些索引鍵可以作為使用 DOTNET_
或 ASPNETCORE_
首碼所定義的環境變數,或者直接透過任何其他組態輸入 (例如 appsettings.json
) 來指定。 每一個都是以分號分隔的埠值清單,如下列範例所示:
ASPNETCORE_HTTP_PORTS=80;8080
ASPNETCORE_HTTPS_PORTS=443;8081
上述範例是下列組態的速記,它會指定配置 (HTTP 或 HTTPS) 和任何主機或 IP。
ASPNETCORE_URLS=http://*:80/;http://*:8080/;https://*:443/;https://*:8081/
HTTP_PORTS 和 HTTPS_PORTS 組態索引鍵的優先順序較低,會以直接在程式碼中提供的 URLS 或值覆寫。 憑證仍然需要透過 HTTPS 的伺服器專有機制來個別設定。
這些組態索引鍵相當於最上層萬用字元繫結。 它們適用於開發和容器案例,但在可能也裝載了其他服務的電腦上執行時,請避免萬用字元。
在伺服器上預先註冊 URL 首碼。
用來設定 HTTP.sys 的內建工具是 netsh.exe。 netsh.exe 是用來保留 URL 前置詞,並指派 X.509 憑證。 此工具需要系統管理員權限。
使用 netsh.exe 工具來為應用程式註冊 URL:
netsh http add urlacl url=<URL> user=<USER>
<URL>
:完整的統一資源定位器 (URL)。 請勿使用萬用字元繫結。 請使用有效的主機名稱或本機 IP 位址。 URL 必須包含結尾斜線。<USER>
:指定使用者或使用者群組名稱。在以下範例中,伺服器的本機 IP 位址是 10.0.0.4
:
netsh http add urlacl url=https://10.0.0.4:443/ user=Users
已註冊 URL 時,此工具會以 URL reservation successfully added
回應。
若要刪除已註冊的 URL,請使用 delete urlacl
命令:
netsh http delete urlacl url=<URL>
在伺服器上註冊 X.509 憑證。
使用 netsh.exe 工具來為應用程式註冊憑證:
netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
<IP>
:指定繫結的本機 IP 位址。 請勿使用萬用字元繫結。 請使用有效的 IP 位址。<PORT>
:指定繫結的連接埠。<THUMBPRINT>
:X.509 憑證指紋。<GUID>
:開發人員產生的 GUID,用來代表應用程式以供參考之用。為了便於參考,請將 GUID 以套件標記的形式儲存在應用程式中:
開啟應用程式的專案檔。
將 <PackageTags>
屬性搭配您所建立的 GUID 新增至新的或現有的 <PropertyGroup>
:
<PropertyGroup>
<PackageTags>00001111-aaaa-2222-bbbb-3333cccc4444</PackageTags>
</PropertyGroup>
在以下範例中:
10.0.0.4
。appid
值。netsh http add sslcert
ipport=10.0.0.4:443
certhash=b66ee04419d4ee37464ab8785ff02449980eae10
appid="{00001111-aaaa-2222-bbbb-3333cccc4444}"
已註冊憑證時,此工具會以 SSL Certificate successfully added
回應。
若要刪除憑證註冊,請使用 delete sslcert
命令:
netsh http delete sslcert ipport=<IP>:<PORT>
以下是 netsh.exe 的參考文件:
執行應用程式。
使用 HTTP (不是 HTTPS) 搭配大於 1024 的連接埠號碼來繫結至 localhost 時,不需要系統管理員權限即可執行應用程式。 針對其他設定 (例如,使用本機 IP 位址或繫結至連接埠 443),請使用系統管理員權限來執行應用程式。
應用程式會在伺服器的公用 IP 位址回應。 在此範例中,是從網際網路透過伺服器的公用 IP 位址 104.214.79.47
連線至伺服器。
在此範例中使用的是開發憑證。 在略過瀏覽器的未受信任憑證警告之後,頁面會安全地載入。
如果是 HTTP.sys 所裝載且與來自網際網路或公司網路的要求進行互動的應用程式,在裝載於 Proxy 伺服器和負載平衡器後方時,可能需要額外的組態。 如需詳細資訊,請參閱設定 ASP.NET Core 以處理 Proxy 伺服器和負載平衡器。
IHttpSysRequestTimingFeature 提供要求的詳細計時資訊:
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys();
var app = builder.Build();
app.Use((context, next) =>
{
var feature = context.Features.GetRequiredFeature<IHttpSysRequestTimingFeature>();
var loggerFactory = context.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
var timestamps = feature.Timestamps;
for (var i = 0; i < timestamps.Length; i++)
{
var timestamp = timestamps[i];
var timingType = (HttpSysRequestTimingType)i;
logger.LogInformation("Timestamp {timingType}: {timestamp}",
timingType, timestamp);
}
return next(context);
});
app.MapGet("/", () => Results.Ok());
app.Run();
IHttpSysRequestTimingFeature.TryGetTimestamp 會擷取所提供計時類型的時間戳記:
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys();
var app = builder.Build();
app.Use((context, next) =>
{
var feature = context.Features.GetRequiredFeature<IHttpSysRequestTimingFeature>();
var loggerFactory = context.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
var timingType = HttpSysRequestTimingType.RequestRoutingEnd;
if (feature.TryGetTimestamp(timingType, out var timestamp))
{
logger.LogInformation("Timestamp {timingType}: {timestamp}",
timingType, timestamp);
}
else
{
logger.LogInformation("Timestamp {timingType}: not available for the "
+ "current request", timingType);
}
return next(context);
});
app.MapGet("/", () => Results.Ok());
app.Run();
[IHttpSysRequestTimingFeature.TryGetElapsedTime](/dotnet/api/microsoft.aspnetcore.server.httpsys.ihttpsysrequesttimingfeature.trygetelapsedtime) 提供兩個指定時間之間的經過的時間:
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.HttpSys;
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseHttpSys();
var app = builder.Build();
app.Use((context, next) =>
{
var feature = context.Features.GetRequiredFeature<IHttpSysRequestTimingFeature>();
var loggerFactory = context.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Sample");
var startingTimingType = HttpSysRequestTimingType.RequestRoutingStart;
var endingTimingType = HttpSysRequestTimingType.RequestRoutingEnd;
if (feature.TryGetElapsedTime(startingTimingType, endingTimingType, out var elapsed))
{
logger.LogInformation(
"Elapsed time {startingTimingType} to {endingTimingType}: {elapsed}",
startingTimingType,
endingTimingType,
elapsed);
}
else
{
logger.LogInformation(
"Elapsed time {startingTimingType} to {endingTimingType}:"
+ " not available for the current request.",
startingTimingType,
endingTimingType);
}
return next(context);
});
app.MapGet("/", () => Results.Ok());
app.Run();
HTTP.sys 中的其他 HTTP/2 功能支援 gRPC,包括對回應結尾和傳送重設框架的支援。
使用 HTTP.sys 執行 gRPC 的需求:
HTTP 結尾與 HTTP 標頭類似,差別在於 HTTP 結尾是在傳送回應本文之後傳送。 對於 IIS 和 HTTP.sys,僅支援 HTTP/2 回應結尾。
if (httpContext.Response.SupportsTrailers())
{
httpContext.Response.DeclareTrailer("trailername");
// Write body
httpContext.Response.WriteAsync("Hello world");
httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}
在上述範例程式碼中:
SupportsTrailers
確保回應支援結尾。DeclareTrailer
將指定的結尾名稱新增至 Trailer
回應標頭。 宣告回應的結尾是選用項目,但建議使用。 如果呼叫 DeclareTrailer
,則必須在傳送回應標頭之前進行。AppendTrailer
會附加結尾。重設允許伺服器重置具有指定錯誤碼的 HTTP/2 要求。 重設要求被視為已中止。
var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);
Reset
在上述程式碼範例中,指定 INTERNAL_ERROR
錯誤碼。 如需 HTTP/2 錯誤碼的詳細資訊,請瀏覽 HTTP/2 規格錯誤碼一節。
如需如何從 HTTP.sys 取得追蹤的詳細資訊,請參閱 HTTP.sys 管理性案例 。
HTTP.sys 是只在 Windows 上執行的 ASP.NET Core 網頁伺服器。 HTTP.sys 是 Kestrel 伺服器的替代方案,可提供一些 Kestrel 未具備的功能。
重要
HTTP.sys 與 ASP.NET Core 模組不相容,且不能與 IIS 或 IIS Express 搭配使用。
HTTP.sys 支援下列功能:
支援的 Windows 版本:
檢視或下載範例程式碼 \(英文\) (如何下載)
HTTP.sys 在下列部署環境中非常有用:
需要直接向網際網路公開伺服器而不使用 IIS。
內部部署需要 Kestrel 中未提供的功能。 如需詳細資訊,請參閱 Windows 索引標籤中的 Kestrel 與HTTP.sys
HTTP.sys 是成熟的技術,可抵禦許多種類的攻擊,並提供功能完整之網頁伺服器的穩固性、安全性及延展性。 IIS 本身在 HTTP.sys 之上以 HTTP 接聽程式的形式執行。
如果符合下列基本需求,即可針對 ASP.NET Core 應用程式啟用 HTTP/2:
如果已建立 HTTP/2 連線,HttpRequest.Protocol 會報告 HTTP/2
。
HTTP/2 預設為啟用。 如果 HTTP/2 連線尚未建立,連線會退為 HTTP/1.1。 Windows 的未來版本會推出 HTTP/2 設定旗標,包括使用 HTTP.sys 來停用 HTTP/2 的功能。
如果符合下列基本需求,即可針對 ASP.NET Core 應用程式啟用 HTTP/3:
https
URL 繫結。上述 Windows 11 組建版本可能需要使用 Windows 測試人員組建。
HTTP/3 會透過 alt-svc
標頭探索為從 HTTP/1.1 或 HTTP/2 的升級。 這表示第一個要求通常會在切換至 HTTP/3 之前使用 HTTP/1.1 或 HTTP/2。 Http.Sys 並不會自動新增 alt-svc
標頭,必須是由應用程式加以新增。 下列程式碼是新增 alt-svc
回應標頭的中介軟體範例。
app.Use((context, next) =>
{
context.Response.Headers.AltSvc = "h3=\":443\"";
return next(context);
});
提早將上述程式碼放在要求管線中。
IIS 也支援傳送 AltSvc HTTP/2 通訊協定訊息 (而不是回應標頭),來通知用戶端指出 HTTP/3 可供使用。 請參閱 EnableAltSvc 登錄機碼。 這需要使用主機名稱而非 IP 位址的 netsh sslcert 繫結。
HTTP.sys 使用 Kerberos 驗證通訊協定委派給核心模式驗證。 Kerberos 和 HTTP.sys 不支援使用者模式驗證。 必須使用電腦帳戶來解密 Kerberos 權杖/票證,該權杖/票證取自 Active Directory,並由用戶端將其轉送至伺服器來驗證使用者。 請註冊主機的服務主體名稱 (SPN),而非應用程式的使用者。
建置主機時,呼叫 UseHttpSys 擴充方法,並指定任何必要的 HttpSysOptions。 下列範例會將選項設定為它們的預設值:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseHttpSys(options =>
{
options.AllowSynchronousIO = false;
options.Authentication.Schemes = AuthenticationSchemes.None;
options.Authentication.AllowAnonymous = true;
options.MaxConnections = null;
options.MaxRequestBodySize = 30000000;
options.UrlPrefixes.Add("http://localhost:5005");
});
webBuilder.UseStartup<Startup>();
});
其他的 HTTP.sys 設定則透過登錄設定處理。
如需 HTTP.sys 選項的詳細資訊,請參閱 HttpSysOptions。
MaxRequestBodySize
任何要求所允許的大小上限 (以位元組為單位)。 當設定為 null
時,要求主體大小上限為無限制。 此限制對升級連線不會有任何影響,因為其一律為無限制。
在 ASP.NET Core MVC 應用程式中針對單一 IActionResult
覆寫限制的建議方式,是在動作方法上使用 RequestSizeLimitAttribute 屬性:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
如果應用程式已開始讀取要求之後,才嘗試設定要求的限制,則會擲回例外狀況。
IsReadOnly
屬性可用來指出 MaxRequestBodySize
屬性是否處於唯讀狀態,代表要設定限制已經太遲。
如果應用程式應該覆寫每個要求的 MaxRequestBodySize,請使用 IHttpMaxRequestBodySizeFeature:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
ILogger<Startup> logger, IServer server)
{
app.Use(async (context, next) =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var serverAddressesFeature =
app.ServerFeatures.Get<IServerAddressesFeature>();
var addresses = string.Join(", ", serverAddressesFeature?.Addresses);
logger.LogInformation("Addresses: {Addresses}", addresses);
await next.Invoke();
});
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
如果您使用 Visual Studio,請確定應用程式未設定為執行 IIS 或 IIS Express。
在 Visual Studio 中,預設啟動設定檔適用於 IIS Express。 若要以主控台應用程式的形式執行專案,請手動變更選取的設定檔,如下列螢幕擷取畫面所示:
判斷要為應用程式開啟的連接埠,然後使用 Windows 防火牆或 New-NetFirewallRule PowerShell Cmdlet 來開啟防火牆連接埠,以允許流量到達 HTTP.sys。 在下列命令和應用程式設定中,會使用連接埠 443。
部署至 Azure VM 時,請在網路安全性群組中開啟連接埠。 在下列命令和應用程式設定中,會使用連接埠 443。
視需要取得並安裝 X.509 憑證。
在 Windows 上,請使用 New-SelfSignedCertificate PowerShell Cmdlet 來建立自我簽署的憑證。 如需不支援的範例,請參閱 UpdateIISExpressSSLForChrome.ps1 \(英文\)。
將自我簽署的憑證或 CA 簽署的憑證安裝在伺服器的 [本機電腦]>個人 存放區中。
如果應用程式是與架構相依的部署,請安裝 .NET Core、.NET Framework 或兩者 (如果應用程式是以 .NET Framework 為目標的 .NET Core 應用程式)。
如果應用程式是自封式部署,則應用程式的部署中會包含執行階段。 不需要在伺服器上安裝任何架構。
設定應用程式中的 URL 和連接埠。
ASP.NET Core 預設會繫結至 http://localhost:5000
。 若要設定 URL 首碼和連接埠,選項包括:
urls
命令列引數ASPNETCORE_URLS
環境變數下列程式碼範例示範如何使用 UrlPrefixes 搭配位於連接埠 443 的伺服器本機 IP 位址 10.0.0.4
:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseHttpSys(options =>
{
options.UrlPrefixes.Add("https://10.0.0.4:443");
});
webBuilder.UseStartup<Startup>();
});
UrlPrefixes
的優點是針對錯誤格式的前置詞會立即產生錯誤訊息。
UrlPrefixes
中的設定會覆寫 UseUrls
/urls
/ASPNETCORE_URLS
設定。 因此,UseUrls
、urls
和 ASPNETCORE_URLS
環境變數的優點,是能更輕鬆地在 Kestrel 和 HTTP.sys 之間切換。
HTTP.sys 使用 HTTP Server API UrlPrefix 字串格式。
警告
請http://*:80/
使用最上層萬用字元繫結 (http://+:80
與 )。 最上層萬用字元繫結會導致應用程式安全性弱點。 這對強式與弱式萬用字元皆適用。 請使用明確的主機名稱或 IP 位址,而不要使用萬用字元。 若您擁有整個父網域 (相對於有弱點的 *.mysub.com
) 的控制權,則子網域萬用字元繫結 (例如 *.com
) 便不構成安全性風險。 如需詳細資訊,請參閱 RFC 9110:第 7.2 節:主機和 :authority。
在伺服器上預先註冊 URL 首碼。
用來設定 HTTP.sys 的內建工具是 netsh.exe。 netsh.exe 是用來保留 URL 前置詞,並指派 X.509 憑證。 此工具需要系統管理員權限。
使用 netsh.exe 工具來為應用程式註冊 URL:
netsh http add urlacl url=<URL> user=<USER>
<URL>
:完整的統一資源定位器 (URL)。 請勿使用萬用字元繫結。 請使用有效的主機名稱或本機 IP 位址。 URL 必須包含結尾斜線。<USER>
:指定使用者或使用者群組名稱。在以下範例中,伺服器的本機 IP 位址是 10.0.0.4
:
netsh http add urlacl url=https://10.0.0.4:443/ user=Users
已註冊 URL 時,此工具會以 URL reservation successfully added
回應。
若要刪除已註冊的 URL,請使用 delete urlacl
命令:
netsh http delete urlacl url=<URL>
在伺服器上註冊 X.509 憑證。
使用 netsh.exe 工具來為應用程式註冊憑證:
netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
<IP>
:指定繫結的本機 IP 位址。 請勿使用萬用字元繫結。 請使用有效的 IP 位址。<PORT>
:指定繫結的連接埠。<THUMBPRINT>
:X.509 憑證指紋。<GUID>
:開發人員產生的 GUID,用來代表應用程式以供參考之用。為了便於參考,請將 GUID 以套件標記的形式儲存在應用程式中:
開啟應用程式的專案檔。
將 <PackageTags>
屬性搭配您所建立的 GUID 新增至新的或現有的 <PropertyGroup>
:
<PropertyGroup>
<PackageTags>00001111-aaaa-2222-bbbb-3333cccc4444</PackageTags>
</PropertyGroup>
在以下範例中:
10.0.0.4
。appid
值。netsh http add sslcert
ipport=10.0.0.4:443
certhash=b66ee04419d4ee37464ab8785ff02449980eae10
appid="{00001111-aaaa-2222-bbbb-3333cccc4444}"
已註冊憑證時,此工具會以 SSL Certificate successfully added
回應。
若要刪除憑證註冊,請使用 delete sslcert
命令:
netsh http delete sslcert ipport=<IP>:<PORT>
以下是 netsh.exe 的參考文件:
執行應用程式。
使用 HTTP (不是 HTTPS) 搭配大於 1024 的連接埠號碼來繫結至 localhost 時,不需要系統管理員權限即可執行應用程式。 針對其他設定 (例如,使用本機 IP 位址或繫結至連接埠 443),請使用系統管理員權限來執行應用程式。
應用程式會在伺服器的公用 IP 位址回應。 在此範例中,是從網際網路透過伺服器的公用 IP 位址 104.214.79.47
連線至伺服器。
在此範例中使用的是開發憑證。 在略過瀏覽器的未受信任憑證警告之後,頁面會安全地載入。
如果是 HTTP.sys 所裝載且與來自網際網路或公司網路的要求進行互動的應用程式,在裝載於 Proxy 伺服器和負載平衡器後方時,可能需要額外的組態。 如需詳細資訊,請參閱設定 ASP.NET Core 以處理 Proxy 伺服器和負載平衡器。
HTTP.sys 中的其他 HTTP/2 功能支援 gRPC,包括對回應結尾和傳送重設框架的支援。
使用 HTTP.sys 執行 gRPC 的需求:
HTTP 結尾與 HTTP 標頭類似,差別在於 HTTP 結尾是在傳送回應本文之後傳送。 對於 IIS 和 HTTP.sys,僅支援 HTTP/2 回應結尾。
if (httpContext.Response.SupportsTrailers())
{
httpContext.Response.DeclareTrailer("trailername");
// Write body
httpContext.Response.WriteAsync("Hello world");
httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}
在上述範例程式碼中:
SupportsTrailers
確保回應支援結尾。DeclareTrailer
將指定的結尾名稱新增至 Trailer
回應標頭。 宣告回應的結尾是選用項目,但建議使用。 如果呼叫 DeclareTrailer
,則必須在傳送回應標頭之前進行。AppendTrailer
會附加結尾。重設允許伺服器重置具有指定錯誤碼的 HTTP/2 要求。 重設要求被視為已中止。
var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);
Reset
在上述程式碼範例中,指定 INTERNAL_ERROR
錯誤碼。 如需 HTTP/2 錯誤碼的詳細資訊,請瀏覽 HTTP/2 規格錯誤碼一節。
HTTP.sys 是只在 Windows 上執行的 ASP.NET Core 網頁伺服器。 HTTP.sys 是 Kestrel 伺服器的替代方案,可提供一些 Kestrel 未具備的功能。
重要
HTTP.sys 與 ASP.NET Core 模組不相容,且不能與 IIS 或 IIS Express 搭配使用。
HTTP.sys 支援下列功能:
支援的 Windows 版本:
檢視或下載範例程式碼 \(英文\) (如何下載)
HTTP.sys 在下列部署環境中非常有用:
需要直接向網際網路公開伺服器而不使用 IIS。
內部部署需要 Kestrel 中未提供的功能。 如需詳細資訊,請參閱 Windows 索引標籤中的 Kestrel 與HTTP.sys
HTTP.sys 是成熟的技術,可抵禦許多種類的攻擊,並提供功能完整之網頁伺服器的穩固性、安全性及延展性。 IIS 本身在 HTTP.sys 之上以 HTTP 接聽程式的形式執行。
如果符合下列基本需求,則可以針對 ASP.NET Core 應用程式啟用 HTTP/2:
如果已建立 HTTP/2 連線,HttpRequest.Protocol 會報告 HTTP/2
。
HTTP/2 預設為啟用。 如果 HTTP/2 連線尚未建立,連線會退為 HTTP/1.1。 Windows 的未來版本會推出 HTTP/2 設定旗標,包括使用 HTTP.sys 來停用 HTTP/2 的功能。
HTTP.sys 使用 Kerberos 驗證通訊協定委派給核心模式驗證。 Kerberos 和 HTTP.sys 不支援使用者模式驗證。 必須使用電腦帳戶來解密 Kerberos 權杖/票證,該權杖/票證取自 Active Directory,並由用戶端將其轉送至伺服器來驗證使用者。 請註冊主機的服務主體名稱 (SPN),而非應用程式的使用者。
建置主機時,呼叫 UseHttpSys 擴充方法,並指定任何必要的 HttpSysOptions。 下列範例會將選項設定為它們的預設值:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseHttpSys(options =>
{
options.AllowSynchronousIO = false;
options.Authentication.Schemes = AuthenticationSchemes.None;
options.Authentication.AllowAnonymous = true;
options.MaxConnections = null;
options.MaxRequestBodySize = 30000000;
options.UrlPrefixes.Add("http://localhost:5005");
});
webBuilder.UseStartup<Startup>();
});
其他的 HTTP.sys 設定則透過登錄設定處理。
HTTP.sys 選項
屬性 | 說明 | 預設 |
---|---|---|
AllowSynchronousIO | 控制是否允許 HttpContext.Request.Body 和 HttpContext.Response.Body 同步輸出/輸入。 |
false |
Authentication.AllowAnonymous | 允許匿名要求。 | true |
Authentication.Schemes | 指定允許的驗證配置。 處置接聽程式之前可隨時修改。 值是由 AuthenticationSchemes enum 提供:Basic 、Kerberos 、Negotiate 、None 和 NTLM 。 |
None |
EnableResponseCaching | 針對含有合格標頭的回應嘗試核心模式快取。 回應可能不包含 Set-Cookie 、Vary 或 Pragma 標頭。 它必須包含為 Cache-Control 的 public 標頭,且有 shared-max-age 或 max-age 值,或是 Expires 標頭。 |
true |
Http503Verbosity | 因為節流條件而拒絕要求時的 HTTP.sys 行為。 |
Http503VerbosityLevel。 基本 |
MaxAccepts | 可同時接受的數目上限。 | 5 × 環境。 ProcessorCount |
MaxConnections | 可接受的同時連線數量上限。 使用 -1 為無限多個。 使用 null 以使用登錄之整個電腦的設定。 |
null (電腦全域 設定) |
MaxRequestBodySize | 請參閱 MaxRequestBodySize 小節。 | 30000000 位元組 (~28.6 MB) |
RequestQueueLimit | 可以加入佇列的最大要求數目。 | 1000 |
RequestQueueMode |
這會指明伺服器是否負責建立和設定要求佇列,或是否應該附加至現有的佇列。 附加至現有佇列時,大多數的現有組態選項都不適用。 |
RequestQueueMode.Create |
RequestQueueName |
HTTP.sys 要求佇列的名稱。 |
null (匿名佇列) |
ThrowWriteExceptions | 指出若回應本文因為用戶端中斷連線而寫入失敗時,應擲回例外狀況或正常完成。 | false (正常完成) |
Timeouts | 公開 HTTP.sys TimeoutManager 設定,這也可在登錄中設定。 API 連結可提供包括預設值在內每個設定的詳細資訊:
|
|
UrlPrefixes | 指定 UrlPrefixCollection 以向 HTTP.sys 註冊。 其中最有用的是 UrlPrefixCollection.Add,用來將首碼新增至集合。 處置接聽程式之前可隨時修改這些內容。 |
MaxRequestBodySize
任何要求所允許的大小上限 (以位元組為單位)。 當設定為 null
時,要求主體大小上限為無限制。 此限制對升級連線不會有任何影響,因為其一律為無限制。
在 ASP.NET Core MVC 應用程式中針對單一 IActionResult
覆寫限制的建議方式,是在動作方法上使用 RequestSizeLimitAttribute 屬性:
[RequestSizeLimit(100000000)]
public IActionResult MyActionMethod()
如果應用程式已開始讀取要求之後,才嘗試設定要求的限制,則會擲回例外狀況。
IsReadOnly
屬性可用來指出 MaxRequestBodySize
屬性是否處於唯讀狀態,代表要設定限制已經太遲。
如果應用程式應該覆寫每個要求的 MaxRequestBodySize,請使用 IHttpMaxRequestBodySizeFeature:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env,
ILogger<Startup> logger, IServer server)
{
app.Use(async (context, next) =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = 10 * 1024;
var serverAddressesFeature =
app.ServerFeatures.Get<IServerAddressesFeature>();
var addresses = string.Join(", ", serverAddressesFeature?.Addresses);
logger.LogInformation("Addresses: {Addresses}", addresses);
await next.Invoke();
});
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
如果您使用 Visual Studio,請確定應用程式未設定為執行 IIS 或 IIS Express。
在 Visual Studio 中,預設啟動設定檔適用於 IIS Express。 若要執行專案作為主控台應用程式,請手動變更選取的設定檔,如下列螢幕擷取畫面所示:
判斷要為應用程式開啟的連接埠,然後使用 Windows 防火牆或 New-NetFirewallRule PowerShell Cmdlet 來開啟防火牆連接埠,以允許流量到達 HTTP.sys。 在下列命令和應用程式設定中,會使用連接埠 443。
部署至 Azure VM 時,請在網路安全性群組中開啟連接埠。 在下列命令和應用程式設定中,會使用連接埠 443。
視需要取得並安裝 X.509 憑證。
在 Windows 上,請使用 New-SelfSignedCertificate PowerShell Cmdlet 來建立自我簽署的憑證。 如需不支援的範例,請參閱 UpdateIISExpressSSLForChrome.ps1 \(英文\)。
將自我簽署的憑證或 CA 簽署的憑證安裝在伺服器的 [本機電腦]>個人 存放區中。
如果應用程式是與架構相依的部署,請安裝 .NET Core、.NET Framework 或兩者 (如果應用程式是以 .NET Framework 為目標的 .NET Core 應用程式)。
如果應用程式是自封式部署,則應用程式的部署中會包含執行階段。 不需要在伺服器上安裝任何架構。
設定應用程式中的 URL 和連接埠。
ASP.NET Core 預設會繫結至 http://localhost:5000
。 若要設定 URL 首碼和連接埠,選項包括:
urls
命令列引數ASPNETCORE_URLS
環境變數下列程式碼範例示範如何使用 UrlPrefixes 搭配位於連接埠 443 的伺服器本機 IP 位址 10.0.0.4
:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseHttpSys(options =>
{
options.UrlPrefixes.Add("https://10.0.0.4:443");
});
webBuilder.UseStartup<Startup>();
});
UrlPrefixes
的優點是針對錯誤格式的前置詞會立即產生錯誤訊息。
UrlPrefixes
中的設定會覆寫 UseUrls
/urls
/ASPNETCORE_URLS
設定。 因此,UseUrls
、urls
和 ASPNETCORE_URLS
環境變數的優點,是能更輕鬆地在 Kestrel 和 HTTP.sys 之間切換。
HTTP.sys 使用 HTTP Server API UrlPrefix 字串格式。
警告
請http://*:80/
使用最上層萬用字元繫結 (http://+:80
與 )。 最上層萬用字元繫結會導致應用程式安全性弱點。 這對強式與弱式萬用字元皆適用。 請使用明確的主機名稱或 IP 位址,而不要使用萬用字元。 若您擁有整個父網域 (相對於有弱點的 *.mysub.com
) 的控制權,則子網域萬用字元繫結 (例如 *.com
) 便不構成安全性風險。 如需詳細資訊,請參閱 RFC 9110:第 7.2 節:主機和 :authority。
在伺服器上預先註冊 URL 首碼。
用來設定 HTTP.sys 的內建工具是 netsh.exe。 netsh.exe 是用來保留 URL 前置詞,並指派 X.509 憑證。 此工具需要系統管理員權限。
使用 netsh.exe 工具來為應用程式註冊 URL:
netsh http add urlacl url=<URL> user=<USER>
<URL>
:完整的統一資源定位器 (URL)。 請勿使用萬用字元繫結。 請使用有效的主機名稱或本機 IP 位址。 URL 必須包含結尾斜線。<USER>
:指定使用者或使用者群組名稱。在以下範例中,伺服器的本機 IP 位址是 10.0.0.4
:
netsh http add urlacl url=https://10.0.0.4:443/ user=Users
已註冊 URL 時,此工具會以 URL reservation successfully added
回應。
若要刪除已註冊的 URL,請使用 delete urlacl
命令:
netsh http delete urlacl url=<URL>
在伺服器上註冊 X.509 憑證。
使用 netsh.exe 工具來為應用程式註冊憑證:
netsh http add sslcert ipport=<IP>:<PORT> certhash=<THUMBPRINT> appid="{<GUID>}"
<IP>
:指定繫結的本機 IP 位址。 請勿使用萬用字元繫結。 請使用有效的 IP 位址。<PORT>
:指定繫結的連接埠。<THUMBPRINT>
:X.509 憑證指紋。<GUID>
:開發人員產生的 GUID,用來代表應用程式以供參考之用。為了便於參考,請將 GUID 以套件標記的形式儲存在應用程式中:
開啟應用程式的專案檔。
將 <PackageTags>
屬性搭配您所建立的 GUID 新增至新的或現有的 <PropertyGroup>
:
<PropertyGroup>
<PackageTags>00001111-aaaa-2222-bbbb-3333cccc4444</PackageTags>
</PropertyGroup>
在以下範例中:
10.0.0.4
。appid
值。netsh http add sslcert
ipport=10.0.0.4:443
certhash=b66ee04419d4ee37464ab8785ff02449980eae10
appid="{00001111-aaaa-2222-bbbb-3333cccc4444}"
已註冊憑證時,此工具會以 SSL Certificate successfully added
回應。
若要刪除憑證註冊,請使用 delete sslcert
命令:
netsh http delete sslcert ipport=<IP>:<PORT>
以下是 netsh.exe 的參考文件:
執行應用程式。
使用 HTTP (不是 HTTPS) 搭配大於 1024 的連接埠號碼來繫結至 localhost 時,不需要系統管理員權限即可執行應用程式。 針對其他設定 (例如,使用本機 IP 位址或繫結至連接埠 443),請使用系統管理員權限來執行應用程式。
應用程式會在伺服器的公用 IP 位址回應。 在此範例中,是從網際網路透過伺服器的公用 IP 位址 104.214.79.47
連線至伺服器。
在此範例中使用的是開發憑證。 在略過瀏覽器的未受信任憑證警告之後,頁面會安全地載入。
如果是 HTTP.sys 所裝載且與來自網際網路或公司網路的要求進行互動的應用程式,在裝載於 Proxy 伺服器和負載平衡器後方時,可能需要額外的組態。 如需詳細資訊,請參閱設定 ASP.NET Core 以處理 Proxy 伺服器和負載平衡器。
HTTP.sys 中的其他 HTTP/2 功能支援 gRPC,包括對回應結尾和傳送重設框架的支援。
使用 HTTP.sys 執行 gRPC 的需求:
HTTP 結尾與 HTTP 標頭類似,差別在於 HTTP 結尾是在傳送回應本文之後傳送。 對於 IIS 和 HTTP.sys,僅支援 HTTP/2 回應結尾。
if (httpContext.Response.SupportsTrailers())
{
httpContext.Response.DeclareTrailer("trailername");
// Write body
httpContext.Response.WriteAsync("Hello world");
httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}
在上述範例程式碼中:
SupportsTrailers
確保回應支援結尾。DeclareTrailer
將指定的結尾名稱新增至 Trailer
回應標頭。 宣告回應的結尾是選用項目,但建議使用。 如果呼叫 DeclareTrailer
,則必須在傳送回應標頭之前進行。AppendTrailer
會附加結尾。重設允許伺服器重置具有指定錯誤碼的 HTTP/2 要求。 重設要求被視為已中止。
var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);
Reset
在上述程式碼範例中,指定 INTERNAL_ERROR
錯誤碼。 如需 HTTP/2 錯誤碼的詳細資訊,請瀏覽 HTTP/2 規格錯誤碼一節。
事件
Power BI DataViz World Championships
2月14日 下午4時 - 3月31日 下午4時
4 次參賽機會,有機會贏得會議套裝行程,現場參與在拉斯維加斯舉行的總決賽
進一步了解訓練
學習路徑
在 Azure 上執行高效能運算 (HPC) 應用程式 - Training
Azure HPC 是適用於 HPC 和 AI 工作負載的特殊用途雲端功能,使用頂尖處理器和 HPC 級的 InfiniBand 互連來提供最佳的應用程式效能、可擴縮性和價值。 Azure HPC 可讓使用者透過一系列高度可用的 HPC 和 AI 技術來發揮創新、生產力和企業靈活性,且可隨著您業務和技術需求的變更進行動態配置。 此學習路徑是一系列可協助您開始使用 Azure HPC 的課程模組,您可以選擇您最感興趣的主題,或逐一完成每個課程模組。