這是我們計(jì)劃在今年晚些時(shí)候發(fā)布的最終.NET 8版本之前的兩個(gè)候選版本中的第一個(gè)。大部分計(jì)劃中的功能和變更都包含在這個(gè)候選版本中,可以供您嘗試使用。您可以在文檔中找到完整的ASP.NET Core在.NET 8中的新功能列表。一些領(lǐng)域(尤其是Blazor)仍然有一些重大的變更待完成,我們預(yù)計(jì)將在下一個(gè).NET 8候選版本中完成這些變更。
以下是此預(yù)覽版中的新功能摘要:
- 服務(wù)器和中間件
- 默認(rèn)情況下禁用HTTP/3
- API編寫
- 在最小API、MVC和SignalR中支持鍵入服務(wù)
- Blazor
- Blazor Web App模板更新
- 從額外的程序集中發(fā)現(xiàn)用于靜態(tài)服務(wù)器呈現(xiàn)的組件
- 路由改進(jìn)
- 觸發(fā)頁面刷新
- 將任意屬性傳遞給
QuickGrid
- 確定表單字段是否具有相關(guān)的驗(yàn)證消息
- 配置.NET WebAssembly運(yùn)行時(shí)
- 在預(yù)先編譯(AOT)編譯后修剪.NET IL
- Identity
- 移除
username
屬性
- 移除
- 單頁應(yīng)用程序(SPA)
- 標(biāo)準(zhǔn).NET模板選項(xiàng)
- 度量
有關(guān)ASP.NET Core在.NET 8中計(jì)劃的更多詳細(xì)信息,請(qǐng)查看GitHub上的完整ASP.NET Core .NET 8路線圖。
開始
要開始使用.NET 8 RC1中的ASP.NET Core,請(qǐng)安裝.NET 8 SDK。
如果您使用Windows并使用Visual Studio,我們建議安裝最新的Visual Studio 2022預(yù)覽版。如果您使用Visual Studio Code,則可以嘗試新的C# Dev Kit。
升級(jí)現(xiàn)有項(xiàng)目
要將現(xiàn)有的ASP.NET Core應(yīng)用程序從.NET 8預(yù)覽7升級(jí)到.NET 8 RC1:
- 將您的應(yīng)用程序的目標(biāo)框架更新為
.net8.0
- 將所有Microsoft.AspNetCore.*包引用更新為
.8.0.0-rc.1.*
- 將所有Microsoft.Extensions.*包引用更新為
.8.0.0-rc.1.*
另請(qǐng)參閱ASP.NET Core .NET 8中的破壞性變更的完整列表。
服務(wù)器和中間件
默認(rèn)情況下禁用HTTP/3
Kestrel中默認(rèn)情況下不再啟用HTTP/3。這個(gè)更改將Kestrel的HTTP協(xié)議行為恢復(fù)到.NET 7狀態(tài),但不同于所有.NET 8預(yù)覽版本。
我們之所以恢復(fù)到.NET 7的行為,是因?yàn)閱⒂肏TTP/3會(huì)導(dǎo)致某些防病毒軟件在啟動(dòng)帶有調(diào)試的應(yīng)用程序時(shí)提示是否允許網(wǎng)絡(luò)訪問。這不是一個(gè)良好的體驗(yàn),因此在我們改進(jìn)開發(fā)人員體驗(yàn)之前,我們將默認(rèn)情況下禁用HTTP/3。
您可以通過設(shè)置您的端點(diǎn)允許的協(xié)議來為每個(gè)端點(diǎn)重新啟用HTTP/3:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, options) =>
{
options.ListenAnyIP(5001, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
listenOptions.UseHttps();
});
});
或者,通過配置默認(rèn)協(xié)議來重新啟用HTTP/3:
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, options) =>
{
options.ConfigureEndpointDefaults(listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
listenOptions.UseHttps();
});
});
有關(guān)HTTP/3要求和配置的更多信息,請(qǐng)參閱在ASP.NET Core Kestrel Web服務(wù)器中使用HTTP/3。
API編寫
在最小API、MVC和SignalR中支持鍵入服務(wù)
在.NET 8預(yù)覽7中,我們引入了對(duì)DI中鍵入服務(wù)的支持。從.NET 8 RC1開始,可以在使用最小API、基于控制器的API和SignalR中使用鍵入服務(wù)。要利用新的鍵入服務(wù)支持,請(qǐng)使用屬性注釋目標(biāo)參數(shù)[FromKeyedServices("keyName")]
。
以下示例展示了最小API和控制器中的支持:
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddKeyedSingleton<ICache, BigCache>("big");
builder.Services.AddKeyedSingleton<ICache, SmallCache>("small");
builder.Services.AddControllers();
var app = builder.Build();
app.MapGet("/big", ([FromKeyedServices("big")] ICache bigCache) => bigCache.Get("date"));
app.MapGet("/small", ([FromKeyedServices("small")] ICache smallCache) => smallCache.Get("date"));
app.MapControllers();
app.Run();
public interface ICache
{
object Get(string key);
}
public class BigCache : ICache
{
public object Get(string key) => $"Resolving {key} from big cache.";
}
public class SmallCache : ICache
{
public object Get(string key) => $"Resolving {key}
from small cache.";
}
[ApiController]
[Route("/cache")]
public class CustomServicesApiController : Controller
{
[HttpGet("big-cache")]
public ActionResult<object> GetOk([FromKeyedServices("big")] ICache cache)
{
return cache.Get("data-mvc");
}
}
public class MyHub : Hub
{
public void Method([FromKeyedServices("small")] ICache cache)
{
Console.WriteLine(cache.Get("signalr"));
}
}
Blazor
Blazor Web App模板更新
在.NET 8中,我們一直在增加Blazor的功能,以便您可以使用Blazor組件來滿足您的所有Web UI需求。您現(xiàn)在可以根據(jù)請(qǐng)求靜態(tài)地從服務(wù)器呈現(xiàn)Blazor組件,逐漸增強(qiáng)體驗(yàn),增強(qiáng)導(dǎo)航和表單處理,流式服務(wù)器呈現(xiàn)更新,并根據(jù)需要添加豐富的交互性,使用Blazor Server或Blazor WebAssembly。為了優(yōu)化應(yīng)用程序的加載時(shí)間,Blazor還可以在運(yùn)行時(shí)自動(dòng)選擇是使用Blazor Server還是Blazor WebAssembly。
這些新的Blazor功能現(xiàn)在都已由Blazor Web App項(xiàng)目模板為您設(shè)置。在此版本中,Blazor Web App模板已進(jìn)行清理和改進(jìn),具有幾個(gè)用于配置不同場景的新選項(xiàng)。
Blazor Web App現(xiàn)在具有以下選項(xiàng):
- 使用交互式WebAssembly組件:啟用對(duì)交互式WebAssembly渲染模式的支持,基于Blazor WebAssembly。
- 使用交互式Server組件:啟用對(duì)交互式Server渲染模式的支持,基于Blazor Server。
- 包括示例頁面:如果選擇此選項(xiàng),項(xiàng)目將包括基于Bootstrap樣式的示例頁面和布局。如果只想要一個(gè)空項(xiàng)目來開始,可以禁用此選項(xiàng)。
如果同時(shí)選擇了WebAssembly和Server渲染模式,那么模板將使用自動(dòng)渲染模式。自動(dòng)渲染模式將在下載.NET運(yùn)行時(shí)和應(yīng)用程序包到瀏覽器時(shí)首先使用Server模式。一旦運(yùn)行時(shí)下載完成,自動(dòng)模式將切換開始使用WebAssembly渲染模式。
默認(rèn)情況下,Blazor Web App模板將在單個(gè)項(xiàng)目中啟用靜態(tài)和交互式服務(wù)器呈現(xiàn)。如果還啟用了WebAssembly渲染模式,則項(xiàng)目將包括一個(gè)額外的客戶端項(xiàng)目,用于您的基于WebAssembly的組件。來自客戶端項(xiàng)目的構(gòu)建輸出將下載到瀏覽器并在客戶端上執(zhí)行。使用WebAssembly或Auto渲染模式的任何組件必須從客戶端項(xiàng)目構(gòu)建。
Blazor Web App模板具有清理的文件結(jié)構(gòu):
- 新的Components文件夾包含服務(wù)器項(xiàng)目中的所有組件。
- Components/Layout文件夾包含應(yīng)用程序布局。
- Components/Pages文件夾包含可路由的頁面組件。
組件名稱和內(nèi)容已進(jìn)行了清理,以匹配其功能:
- Index.razor -> Home.razor
- Counter.razor未更改
- FetchData.razor -> Weather.razor
組件現(xiàn)在更加簡潔和簡單:App
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
<base href="/" />
<link rel="stylesheet" href="bootstrap/bootstrap.min.css" />
<link rel="stylesheet" href="app.css" />
<link rel="stylesheet" href="BlazorApp51.styles.css" />
<link rel="icon" type="image/png" href="favicon.png" />
<HeadOutlet />
</head>
<body>
<Routes />
</body>
</html>
我們對(duì)模板中的組件進(jìn)行了幾處更改:App
- 我們移除了Bootstrap圖標(biāo),并切換為自定義SVG圖標(biāo)。
- 我們將Blazor路由器移動(dòng)到了新的組件,并移除了其參數(shù),因?yàn)樗鼜奈幢皇褂眠^。
Routes
- 我們將默認(rèn)的Blazor錯(cuò)誤UI移到了組件中。
MainLayout
- 我們移除了Blazor腳本標(biāo)簽上的屬性,因?yàn)椴辉傩枰?code>supress-error
- 新組件模板簡化了使整個(gè)應(yīng)用程序具有交互性的過程:只需將所需的渲染模式應(yīng)用于
Routes
和HeadOutlet
組件。根組件需要是靜態(tài)的,因?yàn)樗尸F(xiàn)Blazor腳本,腳本標(biāo)記不能動(dòng)態(tài)刪除。您還不能直接從組件使Blazor路由器具有交互性,因?yàn)樗哂袖秩酒螀?shù),這些參數(shù)不可序列化。從靜態(tài)組件渲染的交互組件必須具有可序列化的參數(shù)。Routes
Routes
HeadOutlet
App
App
Routes
從額外的程序集中發(fā)現(xiàn)靜態(tài)服務(wù)器呈現(xiàn)的組件
您現(xiàn)在可以使用方法AddAdditionalAssemblies()
配置用于發(fā)現(xiàn)靜態(tài)服務(wù)器呈現(xiàn)的Blazor組件的額外程序集:
app.MapRazorComponents<App>()
.AddAdditionalAssemblies(typeof(Counter).Assembly);
路由改進(jìn)
我們已將Blazor路由實(shí)現(xiàn)與ASP.NET Core路由統(tǒng)一。此統(tǒng)一為Blazor路由器添加了以下功能的支持:
-
復(fù)雜段(
"/a{b}cldzjh9fvzrv3"
) - 默認(rèn)值(
"/{tier=free}"
) - 所有內(nèi)置的路由約束
觸發(fā)頁面刷新
您現(xiàn)在可以調(diào)用NavigationManager.Refresh()
以觸發(fā)頁面刷新。這將使用增強(qiáng)的頁面導(dǎo)航(
如果可能)來刷新頁面。否則,它將觸發(fā)完整的頁面刷新。要強(qiáng)制執(zhí)行完整的頁面刷新,請(qǐng)使用NavigationManager.Refresh(forceReload: true)
。
將任意屬性傳遞給QuickGrid
組件現(xiàn)在將任何額外的屬性傳遞給呈現(xiàn)的元素:QuickGrid
<QuickGrid Items="@FilteredPeople" custom-attribute="somevalue" class="custom-class-attribute">
感謝@ElderJames的貢獻(xiàn)!
確定表單字段是否具有相關(guān)的驗(yàn)證消息
新API可以用于確定字段是否有效,而無需獲取驗(yàn)證消息:EditContext.IsValid(FieldIdentifier)
。
感謝@ElderJames的貢獻(xiàn)!
配置.NET WebAssembly運(yùn)行時(shí)
您現(xiàn)在可以在運(yùn)行時(shí)配置WebAssembly上運(yùn)行時(shí)的各種.NET運(yùn)行時(shí)選項(xiàng),使用函數(shù)configureRuntime
:
<script>
Blazor.start({
configureRuntime: dotnet => {
dotnet.withEnvironmentVariable("CONFIGURE_RUNTIME", "true");
}
});
</script>
現(xiàn)在可以從.Blazor.runtime
訪問.NET運(yùn)行時(shí)實(shí)例。
有關(guān)在WebAssembly上運(yùn)行時(shí)的.NET運(yùn)行時(shí)選項(xiàng)和API的更多詳細(xì)信息,請(qǐng)參閱https://github.com/dotnet/runtime/blob/main/src/mono/wasm/runtime/dotnet.d.ts。
在預(yù)先編譯(AOT)編譯后修剪.NET IL
新的MSBuild選項(xiàng)可以在執(zhí)行預(yù)先編譯(AOT)編譯到WebAssembly后刪除編譯方法的.NET IL。此新的修剪模式根據(jù)我們的測試將_framework文件夾的大小減小了1.7%到4.2%。
<PropertyGroup>
<RunAOTCompilation>true</RunAOTCompilation>
<WasmStripILAfterAOT>true</WasmStripILAfterAOT>
</PropertyGroup>
此設(shè)置將修剪大多數(shù)編譯方法的IL代碼,包括庫中的方法和應(yīng)用程序中的方法。并非所有編譯方法都可以修剪,因?yàn)橐恍┓椒ㄈ匀恍枰?NET解釋器在運(yùn)行時(shí)使用。
如果在使用此新的修剪選項(xiàng)時(shí)遇到任何問題,用于AOT編譯的WebAssembly應(yīng)用程序,請(qǐng)通過在dotnet/runtime repo的GitHub上提出問題來告訴我們。
Identity
移除username
屬性
為了簡化映射的身份API并更緊密地與現(xiàn)有的Identity UI對(duì)齊,已移除了username
屬性。現(xiàn)在,用戶名和電子郵件是相同的,并且字段將在將來的命名中使用(或在注冊(cè)用戶時(shí))。username
-> Email
-> NewEmail
單頁應(yīng)用程序(SPA)
標(biāo)準(zhǔn).NET模板選項(xiàng)
Visual Studio模板用于使用ASP.NET Core與流行的前端JavaScript框架(如Angular、React和Vue)現(xiàn)在支持標(biāo)準(zhǔn)的.NET模板選項(xiàng),包括指定目標(biāo).NET框架版本、啟用OpenAPI支持等等。
度量
在.NET 8 RC1中,我們已將新的度量重命名為遵循OpenTelemetry Semantic Conventions。這個(gè)更改基于用戶和庫作者關(guān)于如何命名其自己的計(jì)數(shù)器的反饋。OpenTelemetry是一種現(xiàn)有的已建立標(biāo)準(zhǔn),.NET的內(nèi)置度量和更廣泛的.NET生態(tài)系統(tǒng)遵循該標(biāo)準(zhǔn)是有益的。
- ASP.NET Core的主要HTTP度量現(xiàn)在與OpenTelemetry的
http.server.request.duration
和http.server.active_requests
計(jì)數(shù)器完全匹配。 - ASP.NET Core中的其他計(jì)數(shù)器使用語義約定的命名標(biāo)準(zhǔn)。例如,速率限制中間件有度量標(biāo)識(shí)HTTP請(qǐng)求等待租約和租約持續(xù)時(shí)間的數(shù)量。
- 將租約隊(duì)列長度計(jì)數(shù)器從`rate-limiting
.enqueued-requests重命名為
rate_limiting.queued_requests`。
- 將HTTP請(qǐng)求數(shù)計(jì)數(shù)器從
rate-limiting.current-requests
重命名為rate_limiting.concurrent_requests
。 - 將HTTP限制失敗的請(qǐng)求數(shù)計(jì)數(shù)器從
rate-limiting.denied-requests
重命名為rate_limiting.denied_requests
。 - ASP.NET Core的DNS解析度量現(xiàn)在與OpenTelemetry的
dns.resolver.query_duration
和dns.resolver.query_count
計(jì)數(shù)器完全匹配。 - 度量名稱更改可能會(huì)影響與度量名稱一起記錄的數(shù)據(jù)。
我們已將命名的度量計(jì)數(shù)器添加到ASP.NET Core度量文檔中。
已知問題
ASP.NET Redis基于輸出緩存
在ASP.NET中,基于Redis的輸出緩存存在已知的回歸問題(在.NET 8中首次引入,在Preview 6中宣布);此功能在RC1中將無法工作。已經(jīng)找到了原因,并在RC2中解決了此問題。
Blazor Web App模板創(chuàng)建多個(gè)計(jì)數(shù)器組件
Blazor Web App在啟用交互式WebAssembly組件時(shí)采用了不必要的解決方案。模板生成了兩個(gè)組件:1. 在客戶端項(xiàng)目中帶有渲染模式屬性的組件,2. 服務(wù)器項(xiàng)目中使用客戶端組件的頁面。這個(gè)解決方案是不必要的。可以在將其指令復(fù)制到客戶端項(xiàng)目后,將服務(wù)器項(xiàng)目中的組件刪除。然后在Program.cs中調(diào)用Counter以便可以發(fā)現(xiàn)該組件。`
提供反饋
我們希望您喜歡在.NET 8中的ASP.NET Core的這個(gè)預(yù)覽版本。通過在GitHub上提交問題來告訴我們您對(duì)這些新改進(jìn)的看法。
感謝您嘗試ASP.NET Core!
原文: http://www.jfrwli.cn/uploads/allimg/2qx0yovoz1p