作者:Daniel Roth
排版:Alan Wang
.NET 8 Preview 7 現(xiàn)在已經(jīng)發(fā)布,其中包括了對(duì) ASP.NET Core 的許多重要更新。
以下是預(yù)覽版本中新增功能的摘要:
-
服務(wù)器和中間件
- 防偽中間件
-
API 編寫
- 最小 API 的防偽集成
-
Native AOT
- 請(qǐng)求委托生成器支持?jǐn)r截器功能
- Full TrimMode 用于啟用修剪功能編譯的 Web 項(xiàng)目
WebApplication.CreateEmptyBuilder
-
Blazor
- 防偽集成
- 服務(wù)器端表單處理改進(jìn)
- Auto 渲染模式
- 注冊(cè) root-level 級(jí)聯(lián)值
- 改進(jìn)了交互式組件與服務(wù)器端渲染的集成
-
Virtualize
的新參數(shù)EmptyContent
-
Identity
- 新的承載令牌身份驗(yàn)證處理程序
- 新的 API 端點(diǎn)
-
單頁應(yīng)用程序(SPA)
- 新的 Visual Studio 模板
有關(guān)為 .NET 8的 ASP.NET Core 規(guī)劃的更多詳細(xì)信息,請(qǐng)參閱 GitHub 上的 .NET 8 的完整 ASP.NET Core 路線圖。
入門
如果您想要在 .NET 8 Preview 7 中使用 ASP.NET Core,請(qǐng)安裝 .NET 8 SDK。
如果您在 Windows 上使用 Visual Studio,我們建議您安裝最新的 Visual Studio 2022 預(yù)覽版。如果您使用的是 Visual Studio Code,那么可以嘗試新的 C# 開發(fā)工具包。如果您使用的是 macOS,那么可以在“Preferences”中啟用 .NET 8 的預(yù)覽功能后使用 Visual Studio for Mac 17.6.1 進(jìn)行開發(fā)。
升級(jí)現(xiàn)有項(xiàng)目
若要將現(xiàn)有 ASP.NET Core 應(yīng)用程序從 .NET 8 Preview 6 升級(jí)到 .NET 8 Preview 7,請(qǐng)執(zhí)行以下操作:
- 將應(yīng)用程序的目標(biāo)框架更新為
.NET 8.0
。 - 將所有 Microsoft.AspNetCore.* 包引用更新為
8.0.0-preview.7.*
。 - 將所有 Microsoft.Extensions.* 包引用更新為
8.0.0-preview.7.*
。
具體信息請(qǐng)參閱 .NET 8 的 ASP.NET Core 重要更新的完整列表。
服務(wù)器和中間件
防偽中間件
此版本添加了一個(gè)用于驗(yàn)證防偽令牌以及減輕跨站點(diǎn)請(qǐng)求偽造攻擊的中間件。當(dāng)通過 AddAntiforgery
方法注冊(cè)防偽服務(wù)時(shí),防偽中間件會(huì)自動(dòng)在目標(biāo)應(yīng)用程序中啟用。
var builder = WebApplication.CreateBuilder();
builder.Services.AddAntiforgery();
var app = builder.Build();
// 由 WebApplicationBuilder 隱式添加
// app.UseAntiforgery();
app.Run();
防偽中間件本身不會(huì)中斷請(qǐng)求流水線的執(zhí)行。相反,該中間件會(huì)在當(dāng)前請(qǐng)求的 HttpContext.Features
中設(shè)置 IAntiforgeryValidationFeature
。中間件期望每個(gè)框架實(shí)現(xiàn)(最小 API、MVC、Blazor 等)都會(huì)對(duì)此功能做出反應(yīng)并按預(yù)期中斷執(zhí)行。
只有在以下情況下才會(huì)驗(yàn)證防偽令牌:
- 端點(diǎn)包含實(shí)現(xiàn)了
IAntiforgeryMetadata
接口的元數(shù)據(jù),其中RequiresValidation=true
。 - 與端點(diǎn)關(guān)聯(lián)的 HTTP 方法是相關(guān) HTTP 方法(不是 TRACE、OPTIONS、HEAD、GET)。
- 請(qǐng)求與有效端點(diǎn)相關(guān)聯(lián)。
請(qǐng)注意,為了避免在用戶未經(jīng)身份驗(yàn)證時(shí)無意中讀取表單數(shù)據(jù),防偽中間件必須在身份驗(yàn)證和授權(quán)中間件之后運(yùn)行 。
API 編寫
最小 API 的防偽集成
現(xiàn)在默認(rèn)情況下,接受表單數(shù)據(jù)的最小 API 需要防偽令牌驗(yàn)證。
在下面的代碼示例中:
- 防偽服務(wù)在 DI 中注冊(cè),因此防偽中間件會(huì)自動(dòng)啟用。
- 提供了兩個(gè)端點(diǎn)用于顯示表單:
/antiforgery
:會(huì)渲染一個(gè)帶有隱藏防偽令牌字段的表單;/no-antiforgery
:則渲染一個(gè)沒有防偽令牌字段的表單。 -
/todo
端點(diǎn)處理表單中的Todo
對(duì)象,并自動(dòng)要求防偽令牌驗(yàn)證。
using Microsoft.AspNetCore.Antiforgery;
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder();
builder.Services.AddAntiforgery();
var app = builder.Build();
app.MapGet("/antiforgery", (HttpContext context, IAntiforgery antiforgery) =>
{
var token = antiforgery.GetAndStoreTokens(context);
var html = $"""
<html>
<body>
<form action="/todo" method="POST" enctype="multipart/form-data">
<input name="{token.FormFieldName}" type="hidden" value="{token.RequestToken}" />
<input type="text" name="name" />
<input type="date" name="dueDate" />
<input type="checkbox" name="isCompleted" />
<input type="submit" />
</form>
</body>
</html>
""";
return Results.Content(html, "text/html");
});
app.MapGet("/no-antiforgery", () =>
{
var html = """
<html>
<body>
<form action="/todo" method="POST" enctype="multipart/form-data">
<input type="text" name="name" />
<input type="date" name="dueDate" />
<input type="checkbox" name="isCompleted" />
<input type="submit" />
</form>
</body>
</html>
""";
return Results.Content(html, "text/html");
});
app.MapPost("/todo", ([FromForm] Todo todo) => Results.Ok(todo));
app.Run();
class Todo
{
public string Name { get; set; }
public bool IsCompleted { get; set; }
public DateTime DueDate { get; set; }
}
在 /antiforgery
提交表單將會(huì)得到一個(gè)成功的響應(yīng)。另一方面,在 /no-antiforgery
提交表單將在運(yùn)行時(shí)產(chǎn)生異常,因?yàn)闆]有提供有效的防偽令牌。在 Production 環(huán)境中,這將生成一個(gè)日志而不是拋出異常:
Microsoft.AspNetCore.Http.BadHttpRequestException: Invalid antiforgery token found when reading parameter "Todo todo" from the request body as form.
An unhandled exception has occurred while executing the request.
Microsoft.AspNetCore.Http.BadHttpRequestException: Invalid antiforgery token found when reading parameter "Todo todo" from the request body as form.
---> Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException: The required antiforgery request token was not provided in either form field "__RequestVerificationToken" or header value "RequestVerificationToken".
at Microsoft.AspNetCore.Antiforgery.DefaultAntiforgery.ValidateRequestAsync(HttpContext httpContext)
at Microsoft.AspNetCore.Antiforgery.Internal.AntiforgeryMiddleware.InvokeAwaited(HttpContext context)
Native AOT
請(qǐng)求委托生成器支持?jǐn)r截器功能
.NET 8 Preview 3 中引入的請(qǐng)求委托生成器已更新為使用新的 C# 12 攔截器編譯器功能,以支持在運(yùn)行時(shí)使用靜態(tài)生成的變體攔截對(duì)最小 API 的 Map
操作方法的調(diào)用。 由于這個(gè)變化,用戶可以期望在啟用 PublishAot
編譯中看到應(yīng)用程序的啟動(dòng)性能有所提高。
下表概述了啟動(dòng)時(shí)間的變化情況(即處理在應(yīng)用程序中所有端點(diǎn)所需的時(shí)間)在三種情況下的變化:
- 基線,端點(diǎn)的
RequestDelegates
通過反射和動(dòng)態(tài)代碼生成在運(yùn)行時(shí)生成。在編譯時(shí)沒有攔截器功能生成的端點(diǎn),是 Preview 3 到 Preview 6 中的默認(rèn)設(shè)置。 - 在編譯時(shí)生成的端點(diǎn),使用了攔截器功能 ,是 Preview 7 中的默認(rèn)設(shè)置。
迭代 | 基線(運(yùn)行時(shí)生成的端點(diǎn)) | 請(qǐng)求委托生成器(無攔截器) | 請(qǐng)求委托生成器(帶攔截器) |
---|---|---|---|
1 | 716.2313毫秒 | 372.5172毫秒 | 31.5255毫秒 |
2 | 747.279毫秒 | 355.1435毫秒 | 64.188毫秒 |
3 | 730.975毫秒 | 350.5353毫秒 | 32.9315毫秒 |
4 | 729.2775毫秒 | 345.8684毫秒 | 34.1169毫秒 |
5 | 711.0555毫秒 | 351.2683毫秒 | 38.7152毫秒 |
Full TrimMode 用于啟用修剪功能編譯的 Web 項(xiàng)目
在此預(yù)覽版中,我們引入了一項(xiàng)重大變更將影響通過 PublishTrimmed=true
啟用了裁剪的 Web 項(xiàng)目。 在此版本之前,項(xiàng)目默認(rèn)使用 partial 的 TrimMode。未來,所有面向 .NET 8 或更高版本的項(xiàng)目都將啟用 TrimMode=full
。有關(guān)此重大變更的更多信息,請(qǐng)參閱公告。
WebApplication.CreateEmptyBuilder
我們添加了一個(gè)新的 WebApplicationBuilder
工廠方法,用于構(gòu)建僅包含必要功能的小型應(yīng)用程序:WebApplication.CreateEmptyBuilder(WebApplicationOptions options)
。此 WebApplicationBuilder
是沒有內(nèi)置行為的。您的應(yīng)用程序?qū)H包含您配置的服務(wù)和中間件。
以下是使用此 API 創(chuàng)建小型 Web 應(yīng)用程序的示例:
var builder = WebApplication.CreateEmptyBuilder(new WebApplicationOptions());
builder.WebHost.UseKestrelCore();
var app = builder.Build();
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("Hello, World!");
await next(context);
});
Console.WriteLine("Running...");
app.Run();
在 linux-x64 計(jì)算機(jī)上使用 .NET 8 Preview 7 通過 Native AOT 發(fā)布此代碼會(huì)生成約 8.5 MB
的自包含本機(jī)可執(zhí)行文件。
Blazor
防偽集成
Blazor 端點(diǎn)現(xiàn)在默認(rèn)需要防偽保護(hù)。您可以使用新的防偽中間件啟用防偽支持,并使用 AntiforgeryToken
組件為渲染的表單生成令牌。EditForm
組件將自動(dòng)為您添加防偽令牌。
在 Blazor 組件頁面中使用 [RequireAntiforgeryToken]
屬性來指示組件是否需要防偽投影。 例如,您可以像這樣為頁面禁用防偽要求(不建議?。?/p>
@using Microsoft.AspNetCore.Antiforgery;
@attribute [RequireAntiforgeryToken(required: false)]
服務(wù)器端表單處理改進(jìn)
現(xiàn)在,您可以在使用服務(wù)器端渲染且不使用 EditForm
時(shí)在 Blazor 中構(gòu)建標(biāo)準(zhǔn) HTML 表單。只需使用普通 HTML form
標(biāo)簽創(chuàng)建表單,并指定 @onsubmit
處理程序來處理提交的表單請(qǐng)求。
<form method="post" @formname="contact" @onsubmit="AddContact">
<div>
<label for="name">Name</label>
<InputText id="name" @bind-Value="NewContact.Name" />
</div>
<div>
<label for="email">Email</label>
<InputText id="email" @bind-Value="NewContact.Email" />
</div>
<div>
<InputCheckbox id="send-me-deals" @bind-Value="NewContact.SendMeDeals" />
<label for="send-me-deals">Send me deals</label>
</div>
<button>Submit</button>
<AntiforgeryToken />
</form>
@code {
[SupplyParameterFromForm]
public Contact NewContact { get; set; } = new();
public class Contact
{
public string Name { get; set; }
public string Email { get; set; }
public bool SendMeDeals { get; set; }
}
private async Task AddContact()
{
// Add contact...
NewContact = new();
}
}
現(xiàn)在,所有服務(wù)器端渲染的表單都需要一個(gè)名稱,該名稱用于將提交的請(qǐng)求映射到相應(yīng)的表單處理程序方法和模型綁定。 要指定普通 HTML 表單的名稱,請(qǐng)使用新的 @formname
屬性。 使用 EditForm
時(shí),請(qǐng)使用 FormName
參數(shù)指定名稱。
默認(rèn)情況下,表單名稱必須是唯一的,但您可以使用 FormMappingScope
組件定義表單名稱的范圍。
<FormMappingScope Name="parent-context">
<ComponentWithFormBoundParameter />
</FormMappingScope>
基于 InputBase<TValue>
的輸入將生成與 Blazor 用于模型綁定的名稱相匹配的表單值名稱。您可以使用 [SupplyParameterFromForm]
上的 Name
屬性指定 Blazor 用于將表單數(shù)據(jù)綁定到模型的名稱。您還可以使用 Handler
屬性指定要綁定其數(shù)據(jù)的表單的名稱(在早期預(yù)覽中,Name
屬性用于此目的)。
要將表單分解為多個(gè)子組件,請(qǐng)從 Editor<T>
派生子組件。這將確保您的子組件根據(jù)模型生成正確的表單字段名稱。
Index.razor
<EditForm Model="Customer" method="post" OnSubmit="DisplayCustomer" FormName="customer">
<div>
<label>Name</label>
<InputText @bind-Value="Customer.Name" />
</div>
<AddressEditor @bind-Value="Customer.BillingAddress" />
<button>Send</button>
</EditForm>
@if (submitted)
{
<!-- Display customer data -->
<h3>Customer</h3>
<p>Name: @Customer.Name</p>
<p>Street: @Customer.BillingAddress.Street</p>
<p>City: @Customer.BillingAddress.City</p>
<p>State: @Customer.BillingAddress.State</p>
<p>Zip: @Customer.BillingAddress.Zip</p>
}
@code {
public void DisplayCustomer()
{
submitted = true;
}
[SupplyParameterFromForm] Customer? Customer { get; set; }
protected override void OnInitialized() => Customer ??= new();
bool submitted = false;
public void Submit() => submitted = true;
}
AddressEditor.razor
@inherits Editor<Address>
<div>
<label for="street">Street</label>
<InputText id="street" @bind-Value="Value.Street" />
</div>
<div>
<label for="state">State</label>
<InputText id="state" @bind-Value="Value.State" />
</div>
<div>
<label id="city">City</label>
<InputText for="city" @bind-Value="Value.City" />
</div>
<div>
<label for="zip">Zip</label>
<InputText id="zip" @bind-Value="Value.Zip" />
</div>
Blazor 中的模型綁定現(xiàn)在支持綁定到以下附加類型:
- 遞歸類型
- 帶有構(gòu)造函數(shù)的類型
- 枚舉
您現(xiàn)在還可以使用 [DataMember]
和 [IgnoreDataMember]
屬性來自定義您正在編寫的類型的模型綁定 。 您可以使用這些屬性來重命名屬性、忽略屬性以及根據(jù)需要標(biāo)記屬性。 調(diào)用 AddRazorComponents
時(shí),可以從 RazorComponentOptions
獲得其他模型綁定選項(xiàng)。
Auto 渲染模式
Blazor Web 應(yīng)用程序的新 Auto
交互式渲染模式將 Server
和 WebAssembly
渲染模式的優(yōu)勢(shì)結(jié)合到一個(gè)動(dòng)態(tài)選項(xiàng)中。如果 .NET WebAssembly 運(yùn)行時(shí)可以快速加載(100 毫秒內(nèi)),則 Auto
渲染模式將使用基于 WebAssembly 的渲染。這種情況通常發(fā)生在當(dāng)運(yùn)行時(shí)之前已下載并緩存或使用高速網(wǎng)絡(luò)時(shí)。否則,當(dāng) .NET WebAssembly 運(yùn)行時(shí)在后臺(tái)下載時(shí),Auto
渲染模式會(huì)回退到使用 Server
渲染模式。
如果您要使用 Auto
渲染模式,請(qǐng)?jiān)诮M件實(shí)例上指定 @rendermode="@RenderMode.Auto"
屬性,或在組件定義上指定 @attribute [RenderModeAuto]
。請(qǐng)注意,該組件需要設(shè)置為從服務(wù)器和瀏覽器運(yùn)行,因?yàn)樗仨毼挥谀目蛻舳隧?xiàng)目中,并且它的實(shí)現(xiàn)不得與 Server
或 WebAssembly
綁定。請(qǐng)查看 Blazor Auto 渲染模式示例,了解如何正確設(shè)置。
注冊(cè) root-level 級(jí)聯(lián)值
在 Blazor 中,級(jí)聯(lián)值是一種便捷的方式,可以將狀態(tài)提供給組件層次結(jié)構(gòu)的子樹?,F(xiàn)在,您可以注冊(cè) root-level 級(jí)聯(lián)值,以便整個(gè)組件層次結(jié)構(gòu)都可以使用它們。
// 注冊(cè)固定級(jí)聯(lián)值
services.AddCascadingValue(sp => new MyCascadedThing { Value = 123 });
// 按名稱注冊(cè)固定級(jí)聯(lián)值
services.AddCascadingValue("thing", sp => new MyCascadedThing { Value = 123 });
// 使用 CascadingValueSource<TValue> 注冊(cè)級(jí)聯(lián)值
services.AddCascadingValue(sp =>
{
var thing = new MyCascadedThing { Value = 456 };
var source = new CascadingValueSource<MyCascadedThing>(thing, isFixed: false);
return source;
});
改進(jìn)了交互式組件與服務(wù)器端渲染的集成
.NET 8 中的 Blazor 具有先進(jìn)的服務(wù)器端渲染功能,例如增強(qiáng)的導(dǎo)航和表單處理。此預(yù)覽版改進(jìn)了交互式組件與服務(wù)器端渲染的集成。增強(qiáng)的導(dǎo)航、增強(qiáng)的表單處理和流式渲染現(xiàn)在可以添加和刪除交互式組件并對(duì)其進(jìn)行參數(shù)設(shè)置。
Virtualize 的新參數(shù) EmptyContent
Virtualize
組件現(xiàn)在有一個(gè) EmptyContent
屬性,您可以使用該屬性來定義在沒有項(xiàng)目時(shí)或當(dāng) ItemsProvider
返回 TotalItemCount
為零時(shí)應(yīng)顯示的內(nèi)容。
感謝 @etemi 的貢獻(xiàn)!
Identity
之前在 .NET 8 Preview 4 中,我們添加了新的 Identity API 端點(diǎn)來注冊(cè)和登錄用戶,以簡化自托管身份管理,使得在單頁應(yīng)用程序 (SPA) 和 Blazor 應(yīng)用程序中實(shí)現(xiàn)和自定義 identity 更加容易。默認(rèn)體驗(yàn)是基于 cookie 的,因此它“僅適用于”單域應(yīng)用程序。對(duì)于需要令牌的場(chǎng)景,例如從移動(dòng)客戶端訪問您的 Web 應(yīng)用程序,我們現(xiàn)在提供對(duì)“內(nèi)置”令牌的支持。這些令牌是自包含的,并使用與 cookie 身份驗(yàn)證相同的技術(shù)來生成。值得注意的是,這些不是 JWT,而是自包含的,并且針對(duì)沒有委托身份驗(yàn)證的第一方應(yīng)用程序進(jìn)行了優(yōu)化。在多服務(wù)器環(huán)境中,您需要配置數(shù)據(jù)保護(hù)才能使用共享存儲(chǔ)。
承載令牌身份驗(yàn)證處理程序
新的承載令牌身份驗(yàn)證處理程序與 ASP.NET Core 的內(nèi)置身份驗(yàn)證系統(tǒng)無縫集成。 它可以獨(dú)立使用(不依賴 ASP.NET Core Identity)。它支持發(fā)行和驗(yàn)證令牌。從 Preview 6 開始,它還支持刷新令牌。ASP.NET Core Identity 使用 AddBearerToken
擴(kuò)展將 handler 與 identity 集成。
Identity API 端點(diǎn)
新的 .NET 8 identity API 端點(diǎn)提供基于 HTTP 的 API :
- 在 identity 系統(tǒng)中注冊(cè)新用戶
- 登錄并交換經(jīng)過驗(yàn)證的憑據(jù)以獲取 cookie 或令牌
- 使用刷新令牌刷新憑據(jù),使用戶保持登錄狀態(tài),而無需重新輸入其憑據(jù)
- 在注冊(cè)過程中確認(rèn)電子郵件以進(jìn)行額外驗(yàn)證
- 如果未收到或已過期,請(qǐng)重新發(fā)送確認(rèn)電子郵件
- 重置密碼以支持“忘記密碼”功能
還有一些受保護(hù)的端點(diǎn)需要對(duì)用戶進(jìn)行身份驗(yàn)證:
- 管理雙因素身份驗(yàn)證(2FA)。
- 檢索或更新用戶 identity 配置文件中的信息,包括聲明。
入門
David Fowler 的 identity 端點(diǎn)示例展示了如何配置 identity 以使用新的 handler 和端點(diǎn)。 它還包含一個(gè) .http 文件,用于測(cè)試 Visual Studio 內(nèi)的新端點(diǎn)。
首先,啟用新的 handler 并向應(yīng)用添加身份驗(yàn)證和授權(quán)。
builder.Services.AddAuthentication().AddBearerToken(IdentityConstants.BearerScheme);
builder.Services.AddAuthorizationBuilder();
下一步:
- 映射 identity 模型
- 為 identity 存儲(chǔ)指定 DbContext
- 選擇使用新端點(diǎn)
builder.Services.AddIdentityCore<MyUser>()
.AddEntityFrameworkStores<AppDbContext>()
.AddApiEndpoints();
調(diào)用 Build()
后,將 identity 端點(diǎn)映射到應(yīng)用程序中的路由。
app.MapIdentityApi<MyUser>();
現(xiàn)在您可以將 API 配置為使用 identity。此端點(diǎn)訪問 identity 以返回登錄用戶的名稱,并且僅適用于經(jīng)過身份驗(yàn)證的用戶。
app.MapGet("/", (ClaimsPrincipal user) => $"Hello {user.Identity!.Name}").RequireAuthorization();
示例會(huì)話如下所示:
-
POST
到/register
端點(diǎn)以注冊(cè)用戶。
{
"user" : "test",
"password" : "@T35t!",
"email" : "test@notadomain.xyz"
}
-
POST
到/login?cookieMode=false&persistCookies=false
端點(diǎn)以登錄用戶。
{
"user" : "test",
"password" : "@T35t!"
}
- 接收
access_token
、expiration 和refresh_token
。
{
"token_type": "Bearer",
"access_token": "CfDJ9NHobblyWobblyGobblyGoop...",
"expires_in": 3600,
"refresh_token": "TokenBabbelYabbaDabbaDoo..."
}
- 通過將請(qǐng)求的
Authentication
標(biāo)頭設(shè)置為Bearer xxx
(其中xxx
是access_token
),使用令牌調(diào)用受保護(hù)的 API。 - 當(dāng)用戶的憑據(jù)過期或即將過期時(shí),
POST
到/refresh
端點(diǎn)并傳遞refresh_token
。
{
"refreshToken": "TokenBabbelYabbaDabbaDoo..."
}
- 這將生成新的
access_token
、expiration 和refresh_token
。
這些新的構(gòu)建模塊可以更輕松地構(gòu)建非委托驗(yàn)證的身份驗(yàn)證程序。
單頁應(yīng)用程序
新的 Visual Studio 模板
我們一直與 Visual Studio 團(tuán)隊(duì)密切合作,以確保 Visual Studio JavaScript 和 TypeScript 開發(fā)體驗(yàn)?zāi)芙o ASP.NET Core 開發(fā)人員帶來出色的體驗(yàn)。Visual Studio 包含適用于 Angular、React 和 Vue 的新項(xiàng)目模板,這些模板基于新的 JavaScript 項(xiàng)目系統(tǒng) (.esproj) 構(gòu)建,并與 ASP.NET Core 后端項(xiàng)目集成。
這些 Visual Studio 模板為 .NET 和 JavaScript 開發(fā)人員提供了豐富的功能:
- 快速入門 JavaScript 前端和 ASP.NET Core 后端。
- 及時(shí)了解最新的前端框架版本。
- 與最新的前端框架命令行工具集成。
- JavaScript 和 TypeScript 的模板。
- 豐富的 JavaScript 和 TypeScript 代碼編輯經(jīng)驗(yàn)。
- 清晰的前端和后端項(xiàng)目分離。
- 將 JavaScript 構(gòu)建工具與您的 .NET 構(gòu)建集成。
- npm 依賴管理 UI。
- 與 Visual Studio Code 調(diào)試和啟動(dòng)配置兼容。
- 使用您最喜歡的 JavaScript 測(cè)試框架在測(cè)試資源管理器中運(yùn)行前端單元測(cè)試。
為了專注于為前端 JavaScript 框架與 ASP.NET Core 的使用提供最佳的開發(fā)體驗(yàn),我們從 .NET 8 SDK 中刪除了現(xiàn)有的 Angular 和 React 模板,轉(zhuǎn)而采用新的 Visual Studio 模板。 我們正在與 Visual Studio 團(tuán)隊(duì)合作,進(jìn)一步改進(jìn)帶有 ASP.NET Core 模板的新 Visual Studio JavaScript,以支持跨平臺(tái)開發(fā)、與 ASP.NET Core 客戶端 Web 資產(chǎn)集成、簡化發(fā)布并面向所有受支持的 .NET 版本。
您可以通過安裝最新的 Visual Studio 預(yù)覽版,然后按照 Visual Studio 文檔中的 Angular、React 和 Vue 教程中的任意一個(gè)來嘗試新的 Visual Studio JavaScript 模板。 如果您對(duì)新模板有反饋,可以使用 Visual Studio 發(fā)送反饋工具與我們分享。
提供反饋
我們希望您喜歡 .NET 8 中的 ASP.NET Core 預(yù)覽版。請(qǐng)?jiān)?GitHub 上提交問題,讓我們知道您對(duì)這些新改進(jìn)的看法。文章來源:http://www.zghlxwxcb.cn/news/detail-667881.html
感謝您使用 ASP.NET Core!文章來源地址http://www.zghlxwxcb.cn/news/detail-667881.html
到了這里,關(guān)于.NET 8 Preview 7 中的 ASP.NET Core 更新的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!