作者:Daniel Roth - Principal Program Manager, ASP.NET
翻譯:Alan Wang
排版:Alan Wang
.NET 8 Preview 4 現(xiàn)已可用,并包括了許多對 ASP.NET Core 的新改進(jìn)。
以下是本預(yù)覽版本中的新內(nèi)容摘要:
- Blazor
- 使用 Blazor 組件進(jìn)行流式渲染
- 使用 Blazor SSR 處理表單提交
- 在 Blazor 中路由到命名元素
- Webcil 為 Blazor WebAssembly 應(yīng)用程序打包
- API 編寫
- minimal API 中表單綁定的擴(kuò)展支持
- API 項(xiàng)目模板包含
.http
文件
- Native AOT
- 編譯時(shí)生成的 minimal API 的日志記錄和異常處理
- ASP.NET Core 頂級 API 注釋以去除警告
- 通過可配置的 HTTPS 支持縮小應(yīng)用程序大小
- Worker Service 模板更新
- 在 slim builder 中配置的其他默認(rèn)服務(wù)
- API 模板 JSON 配置更改
- 支持編譯器生成的
IAsyncEnumerable
無法表達(dá)類型的 JSON 序列化
- 認(rèn)證和授權(quán)
- 標(biāo)識 API 端點(diǎn)
- 改進(jìn)使用
IAuthorizationRequirementData
的自定義認(rèn)證策略的支持
- ASP.NET Core metrics
更多有關(guān) .NET 8 中 ASP.NET Core 的計(jì)劃,請?jiān)?GitHub 中查看完整的 ASP.NET Core .NET 8 路線圖。
開始
在 .NET 8 Preview 4 中開始 ASP.NET Core,請安裝 .NET 8 SDK。
如果您在 Windows 上使用 Visual Studio,我們建議您安裝最新的 Visual Studio 2022 preview。目前 Visual Studio for Mac 尚不支持 .NET 8 預(yù)覽版。
升級現(xiàn)有項(xiàng)目
將現(xiàn)有 ASP.NET Core 應(yīng)用從 .NET 8 Preview 3 升級到 .NET 8 Preview 4:
- 將應(yīng)用程序的目標(biāo)框架更新為
net8.0
- 將所有 Microsoft.AspNetCore.* 包引用更新為
8.0.0-preview.4.*
- 將所有 Microsoft.Extensions.* 包引用更新為
8.0.0-preview.4.*
查看 .NET 8 中 ASP.NET Core 所有突破性改變的完整列表。
Blazor
使用 Blazor 組件進(jìn)行流式渲染
在 .NET 8 中,使用 Blazor 進(jìn)行服務(wù)器端渲染(SSR)時(shí),您現(xiàn)在可以在響應(yīng)流上流式傳輸內(nèi)容更新。流式渲染可以改善服務(wù)器端渲染頁面的用戶體驗(yàn),這些頁面需要執(zhí)行長時(shí)間運(yùn)行的異步任務(wù)才能完全渲染。
例如,為了渲染頁面,您可能需要進(jìn)行長時(shí)間運(yùn)行的數(shù)據(jù)庫查詢或 API 調(diào)用。通常,渲染頁面的所有異步任務(wù)都必須在渲染的響應(yīng)可以發(fā)送之前完成,這可能會導(dǎo)致頁面延遲加載。流式渲染最初使用占位符內(nèi)容渲染整個(gè)頁面,同時(shí)執(zhí)行異步操作。一旦異步操作完成,更新的內(nèi)容將通過同一響應(yīng)連接發(fā)送到客戶端,然后由 Blazor 修補(bǔ)到 DOM 中。這種方法的好處在于應(yīng)用程序的主要布局可以盡可能快地渲染,一旦內(nèi)容準(zhǔn)備好,頁面就會更新。
要啟用流式渲染,您首先需要添加新的 Blazor 腳本。
<script src="_framework/blazor.web.js" suppress-error="BL9992"></script>
注意,如果你正在將此腳本添加到 Blazor 組件(如布局組件)中,則需要添加 suppress-error="BL9992"
屬性,以避免出現(xiàn)在組件中使用腳本標(biāo)記的錯(cuò)誤。
然后,要為特定組件啟用流式渲染,請使用 [StreamRendering(true)]
屬性。這通常使用 @attribute Razor
指令完成:
@page "/fetchdata"
@using BlazorSSR.Data
@inject WeatherForecastService ForecastService
@attribute [StreamRendering(true)]
<PageTitle>Weather forecast</PageTitle>
<h1>Weather forecast</h1>
@if (forecasts is null)
{
<p><em>Loading...</em></p>
}
else
{
// Render weather forecasts
}
@code {
private string message;
protected override async Task OnInitializedAsync()
{
forecasts = await ForecastService.GetForecastAsync(DateOnly.FromDateTime(DateTime.Now));
}
}
如今,組件不再需要等待任何異步任務(wù)即可使用占位符內(nèi)容(“Loading…”)完成初始渲染。異步任務(wù)完成后,更新的內(nèi)容被流式傳輸?shù)巾憫?yīng),然后由 Blazor 修補(bǔ)到 DOM 中。
使用 Blazor SSR 處理表單提交
現(xiàn)在可以使用 Blazor 組件來處理服務(wù)器端渲染的表單提交。
要啟用從服務(wù)器處理表單提交,首先需要使用 CascadingModelBinder
組件設(shè)置模型綁定上下文。一個(gè)簡單的方法是在應(yīng)用程序的主布局中:
<CascadingModelBinder>
@Body
</CascadingModelBinder>
要在 Blazor 中定義一個(gè)表單,可以使用現(xiàn)有的 EditForm
組件和相應(yīng)的輸入組件,比如 InputText
、InputSelect
等等。
EditForm
組件將渲染一個(gè)標(biāo)準(zhǔn)的 HTML form
元素,因此您可以使用 method
屬性來指定表單是否應(yīng)該發(fā)送 POST 請求。 GET 請求不支持 EditForm
事件處理程序。
提交表單時(shí),請求將被路由到相應(yīng)的頁面,然后由具有 handler
處理程序查詢字符串參數(shù)指定的匹配表單處理程序名稱的表單處理??梢允褂?FormHandlerName
屬性 為 EditForm
指定表單處理程序名稱。如果頁面上只有一個(gè)表單,則不需要指定名稱。然后你可以使用 EditForm
事件處理表單提交。
對模型綁定和驗(yàn)證請求數(shù)據(jù)的支持尚未實(shí)現(xiàn)(即將實(shí)現(xiàn)?。┑梢允褂?code>FormDataProvider 服務(wù)手動(dòng)處理請求數(shù)據(jù)。 FormDataProvider.Entries
屬性提供對表單數(shù)據(jù)的訪問, FormDataProvider.Name
屬性指定所需的表單處理程序。
以下是 Blazor 中一個(gè)簡單的服務(wù)器端渲染表單的樣子:
@inject FormDataProvider FormData
<EditForm method="POST" Model="exampleModel" OnValidSubmit="HandleSubmit">
<InputText @bind-Value="exampleModel.Name" />
<button type="submit">Submit</button>
</EditForm>
@code {
ExampleModel exampleModel = new();
protected override void OnInitialized()
{
// Manually model bind the form data using the FormDataProvider service
if (FormData.Entries.TryGetValue("Name", out var nameValues))
{
exampleModel.Name = nameValues.First();
}
}
void HandleSubmit()
{
// Handle the submitted form data
}
public class ExampleModel
{
public string? Name { get; set; }
}
}
在 Blazor 中路由到命名元素
Blazor 現(xiàn)在支持使用客戶端路由,使用標(biāo)準(zhǔn) URL 片段導(dǎo)航到頁面上的特定 HTML 元素。如果使用標(biāo)準(zhǔn)id
屬性為 HTML 元素指定標(biāo)識符,那么當(dāng) URL 片段與元素標(biāo)識符匹配時(shí),Blazor 將正確滾動(dòng)到該元素。
Webcil 為 Blazor WebAssembly 應(yīng)用程序打包
您現(xiàn)在可以使用 Blazor WebAssembly 應(yīng)用程序試用新的 Webcil 軟件包。Webcil .NET 程序集的 web 友好包。它會刪除任何特定于本機(jī) Windows 執(zhí)行的內(nèi)容,以避免在部署到組織下載或使用 .dll 文件的環(huán)境時(shí)出現(xiàn)問題。
要使 Blazor WebAssembly 應(yīng)用程序能夠使用 Webcil,請將 WasmEnableWebcil
屬性添加到項(xiàng)目文件中:
<PropertyGroup>
<WasmEnableWebcil>true</WasmEnableWebcil>
</PropertyGroup>
如果您在環(huán)境中使用 .webcil 文件時(shí)遇到問題,請?jiān)?GitHub 上創(chuàng)建 issue 讓我們知道。
API 編寫
minimal API 中表單綁定的擴(kuò)展支持
此預(yù)覽版本介紹了對在 minimal API 中綁定到表單類型的擴(kuò)展支持。現(xiàn)在可以在不需要FromForm
屬性的情況下推斷基于表單的參數(shù)。對基于表單的參數(shù)支持包括:IFormCollection
、IFormFile
以及 IFormFileCollection
。為表單參數(shù)推斷 OpenAPI 元數(shù)據(jù),以支持與 Swagger UI 的集成。
以下代碼樣例展示了如何實(shí)現(xiàn)一個(gè) minimal API,通過利用從IFormFile
類型推斷的綁定來處理文件上傳。
var app = WebApplication.Create();
string GetOrCreateFilePath(string fileName, string filesDirectory = "uploadFiles")
{
var directoryPath = Path.Combine(app.Environment.ContentRootPath, filesDirectory);
Directory.CreateDirectory(directoryPath);
return Path.Combine(directoryPath, fileName);
}
async Task UploadFileWithName(IFormFile file, string fileSaveName)
{
var filePath = GetOrCreateFilePath(fileSaveName);
await using var fileStream = new FileStream(filePath, FileMode.Create);
await file.CopyToAsync(fileStream);
}
app.MapPost("/upload", async (IFormFile file) => {
var fileSaveName = Guid.NewGuid().ToString("N") + Path.GetExtension(file.FileName);
await UploadFileWithName(file, fileSaveName);
return TypedResults.Ok("File uploaded successfully!");
});
app.Run();
這一功能在使用基于運(yùn)行時(shí)的代碼生成以及在利用新的編譯時(shí)代碼生成的本地 AOT 場景的 minimal API 中得到支持。
注意:在應(yīng)用程序中實(shí)現(xiàn)表單時(shí),防御 XSRF 攻擊 非常重要。 此 代碼樣例 概述了如何使用 ASP.NET 中的防偽服務(wù)來支持在 minimal API 中生成和驗(yàn)證防偽令牌。
API 項(xiàng)目模板包含 .http 文件
API 項(xiàng)目模板(通過dotnet new api
生成)現(xiàn)在包含一個(gè).http
文件,可用于從 Visual Studio 中的新 HTTP 編輯器向應(yīng)用程序中定義的端點(diǎn)發(fā)送請求。
@MyApi_HostAddress = http://localhost:5233
GET {{MyApi_HostAddress}}/todos/
Accept: application/json
###
GET {{MyApi_HostAddress}}/todos/1
Accept: application/json
###
Native AOT
編譯時(shí)生成的 minimal API 的日志記錄和異常處理
運(yùn)行時(shí)生成的最小 API 支持在參數(shù)綁定失敗時(shí)自動(dòng)記錄日志(或在開發(fā)環(huán)境中拋出異常)。在此預(yù)覽中,我們引入了對在編譯時(shí)通過 Request Delegate Generator (RDG)生成的 API 的相同支持。
考慮以下 API 端點(diǎn),我們通過設(shè)置<EnableRequestDelegateGenerator>true</EnableRequestDelegateGenerator>
啟用了 RDG:
var app = WebApplication.Create();
app.MapGet("/hello/{name}", (string name)
=> $"Hello {name}!");
app.MapGet("/age", (DateTime birthDate)
=> $"You're about {DateTime.Now.Year - birthDate.Year} years old!");
app.Run();
發(fā)送以下請求將拋出一個(gè)BadHttpRequestException
,因?yàn)槁酚苫虿樵冏址袥]有提供所需的name
參數(shù)。
curl "http://localhost:5056/hello"
Microsoft.AspNetCore.Http.BadHttpRequestException: Required parameter "string name" was not provided from route or query string.
....
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
類似地,向/age
端點(diǎn)發(fā)送帶有不可解析的birthDate
值將拋出異常。
curl "http://localhost:5056/age?birthDate=invalidDate"
Microsoft.AspNetCore.Http.BadHttpRequestException: Failed to bind parameter "DateTime birthDate" from "invalidDate".
...
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddlewareImpl.Invoke(HttpContext context)
ASP.NET Core 頂級 API 注釋以去除警告
為幫助開發(fā)人員了解哪些功能與 Native AOT 不兼容,我們注釋了不能與 Native AOT 可靠工作的子系統(tǒng)的主要入口點(diǎn)。當(dāng)從啟用了 Native AOT 的應(yīng)用程序調(diào)用這些方法時(shí),開發(fā)人員將收到警告。例如,以下代碼段將在調(diào)用AddControllers
時(shí)生成警告,以指示此 API 不安全。
通過可配置的 HTTPS 支持縮小應(yīng)用程序大小
在預(yù)覽版4中,我們進(jìn)一步減少了不需要 HTTPS 或 HTTP/3 支持的應(yīng)用程序的 Native AOT 二進(jìn)制大小。這對于在 TLS 終端代理(例如,托管在 Azure 上)后面運(yùn)行的應(yīng)用程序來說非常常見。
當(dāng)您使用新的 new WebApplication.CreateSlimBuilder
時(shí),默認(rèn)情況下不會包括此功能。它可以通過分別調(diào)用builder.WebHost.UseKestrelHttpsConfiguration()
或 builder.WebHost.UseQuic()
來重新添加。
由于這些和其他更改,我們可以從預(yù)覽3更新我們的表:
我們在基準(zhǔn)測試實(shí)驗(yàn)室中運(yùn)行了一個(gè)簡單的 ASP.NET Core API 應(yīng)用程序,來比較使用和不使用 Native AOT 發(fā)布的應(yīng)用程序大小、內(nèi)存使用、啟動(dòng)時(shí)間和 CPU 負(fù)載的差異:
發(fā)布種類 | 啟動(dòng)時(shí)間(ms) | 應(yīng)用程序大?。∕B) |
---|---|---|
Default | 169 | 88.5 |
Native AOT – Preview 3 | 34 | 11.3 |
Native AOT – Preview 4 | 32 | 9.3 |
請注意應(yīng)用程序大小這 2 MB 的減小。
您可以在我們的公共基準(zhǔn)儀表盤上探索這些以及更多指標(biāo)。
Worker Service 模板更新
ASP.NET Core 中的 Worker Service 模板(可通過dotnet new worker
獲得)現(xiàn)在包括對--aot
標(biāo)志的支持以啟用 AOT 發(fā)布來創(chuàng)建 Worker Service 項(xiàng)目。
dotnet new worker -o WorkerWithAot --aot
模板也進(jìn)行了更新,以利用簡化的HostApplicationBuilder
來配置應(yīng)用程序主機(jī)。
using WorkerWithAot;
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHostedService<Worker>();
var host = builder.Build();
host.Run();
在 slim builder 中配置的其他默認(rèn)服務(wù)
.NET 8 Preview 3 中引入的 WebApplication.CreateSlimBuilder
API,初始化應(yīng)用程序中的基本功能,以最小化其部署大小。在 .NET 8 Preview 4 中,我們更新了SlimBuilder
使其包含以下功能,以改善開發(fā)體驗(yàn),同時(shí)仍將應(yīng)用程序的總體大小保持在10 MB 以下。
- appsettings.json 和 appsettings 的 JSON 文件配置
{EnvironmentName}.json - 用戶機(jī)密配置
- 控制臺日志記錄
- 日志記錄配置
API 模板 JSON 配置更改
我們在 .NET 8 Preview 3 中引入了新的 API 項(xiàng)目模板。在 Preview 4 中,使用 --aot
選項(xiàng)使用此模板創(chuàng)建的項(xiàng)目,已更改為將應(yīng)用程序的源代碼生成的 JsonSerializationContext
插入到 JsonSerializerOptions.TypeInfoResolverChain
的開頭。以前生成的代碼使用了JsonSerializerOptions.AddContext<T>
API,并且使用 Preview 3 版本的模板創(chuàng)建的任何項(xiàng)目都應(yīng)更新為調(diào)用新的 API。
您可在 .NET 8 Preview 4發(fā)布 中閱讀有關(guān)JsonSerializerOptions.TypeInfoResolverChain
API 的更多信息。
支持編譯器生成的 IAsyncEnumerable 無法表達(dá)類型的 JSON 序列化
現(xiàn)在支持由 C# 編譯器實(shí)現(xiàn)的IAsyncEnumerable<T>
實(shí)現(xiàn)的 JSON 序列化,從而在配置為發(fā)布 native AOT 的 ASP.NET Core 項(xiàng)目中開房了它們的使用。如果路由處理程序返回調(diào)用 API 的結(jié)果,該 API 使用IAsyncEnumerable<T>
和 yield return
異步返回枚舉的結(jié)果,例如從數(shù)據(jù)庫查詢中具體化行(示例),那么這將非常有用。
您可以在 .NET 8 Preview 4發(fā)布中了解更多關(guān)于 JSON 序列化程序?qū)o法表達(dá)類型的支持。
認(rèn)證和授權(quán)
標(biāo)識 API 端點(diǎn)
我們很高興介紹MapIdentityApi<TUser>()
,它是一種擴(kuò)展方法,添加了兩個(gè)新的 API 端點(diǎn)(/register
和 /login
)。MapIdentityApi
的主要目標(biāo)是使開發(fā)人員能夠輕松地在基于 JavaScript 的單頁應(yīng)用程序(SPA)或 Blazor 應(yīng)用程序中使用 ASP.NET Core Identity 進(jìn)行身份驗(yàn)證。MapIdentityApi
沒有使用基于 Razor Pages 的 ASP.NET Core Identity 提供的默認(rèn) UI,而是添加了更適合 SPA 應(yīng)用程序和非瀏覽器應(yīng)用程序的 JSON API 端點(diǎn)。
除了用戶注冊和登錄之外,身份 API 端點(diǎn)還將在即將到來的預(yù)覽中支持雙重身份驗(yàn)證和電子郵件驗(yàn)證等功能。您可以在 ASP.NET Core GitHub 存儲庫上標(biāo)記為 feature-token-identity 的 issue 中找到計(jì)劃功能的列表。
以下展示了 ASP.NET Core 應(yīng)用程序的Program.cs
,該應(yīng)用程序使用 MapIdentityApi
來啟用 opaque bearer token 和 cookie 身份驗(yàn)證。要單獨(dú)啟用 cookie 或令牌身份驗(yàn)證,您可以直接調(diào)用現(xiàn)有的AddCookie
或新的AddBearerToken
AuthenticationBuilder
擴(kuò)展方法。兩者都是通過下面的AddIdentityApiEndpoints
方法完成的:
// usings ...
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddAuthorization();
builder.Services.AddDbContext<ApplicationDbContext>(
options => options.UseSqlite(builder.Configuration["ConnectionString"]));
builder.Services.AddIdentityApiEndpoints<IdentityUser>()
.AddEntityFrameworkStores<ApplicationDbContext>();
var app = builder.Build();
app.MapGroup("/identity").MapIdentityApi<IdentityUser>();
app.MapGet("/requires-auth", (ClaimsPrincipal user) => $"Hello, {user.Identity?.Name}!").RequireAuthorization();
app.Run();
// public class ApplicationDbContext : IdentityDbContext<IdentityUser> ...
在客戶端上,假設(shè)httpClient
、 username
和 password
已在 .NET 控制臺應(yīng)用程序中初始化,則可以如下調(diào)用 /register
端點(diǎn):
// Email confirmation will be added later.
// The request body is: { "username": "<username>", "password": "<password>" }
await httpClient.PostAsJsonAsync("/identity/register", new { username, password });
您可以使用 /login
端點(diǎn)登錄并獲得 opaque bearer token:
// 2fa flow will be added later.
// The request body is: { "username": "<username>", "password": "<password>" }
var loginResponse = await httpClient.PostAsJsonAsync("/identity/login", new { username, password });
// loginResponse is similar to the "Access Token Response" defined in the OAuth 2 spec
// {
// "token_type": "Bearer",
// "access_token": "...",
// "expires_in": 3600
// }
// refresh token is likely to be added later
var loginContent = await loginResponse.Content.ReadFromJsonAsync<JsonElement>();
var accessToken = loginContent.GetProperty("access_token").GetString();
httpClient.DefaultRequestHeaders.Authorization = new("Bearer", accessToken);
Console.WriteLine(await httpClient.GetStringAsync("/requires-auth"));
或者,如果您想獲得一個(gè) cookie,您可以在 /login
隊(duì)列字符串中設(shè)置 ?cookieMode=true
:
// HttpClientHandler.UseCookies is true by default on supported platforms.
// The request body is: { "username": "<username>", "password": "<password>" }
await httpClient.PostAsJsonAsync("/identity/login?cookieMode=true", new { username, password });
Console.WriteLine(await httpClient.GetStringAsync("/requires-auth"));
我們期待您對我們早期工作的反饋,以改善 SPA 和移動(dòng)應(yīng)用程序的身份體驗(yàn)。
改進(jìn)使用 IAuthorizationRequirementData的自定義認(rèn)證策略的支持
在此預(yù)覽版本之前,向端點(diǎn)添加參數(shù)化授權(quán)策略需要編寫大量代碼。
- 為每個(gè)策略實(shí)現(xiàn)
AuthorizeAttribute
- 實(shí)現(xiàn)
AuthorizationPolicyProvider
以處理基于字符串的合同中的自定義策略 - 為策略實(shí)現(xiàn)
AuthorizationRequirement
- 為每個(gè)需求實(shí)現(xiàn)一個(gè)
AuthorizationHandler
下面是自定義參數(shù)化策略的部分實(shí)現(xiàn)。未刪節(jié)版本包含完整的代碼。
var builder = WebApplication.CreateBuilder();
builder.Services.AddAuthentication().AddJwtBearer();
builder.Services.AddAuthorization();
builder.Services.AddSingleton<IAuthorizationPolicyProvider, MinimumAgePolicyProvider>();
builder.Services.AddSingleton<IAuthorizationHandler, MinimumAgeAuthorizationHandler>();
var app = builder.Build();
app.MapControllers();
app.Run();
[ApiController]
[Route("api/[controller]")]
public class GreetingsController : Controller
{
[MinimumAgeAuthorize(16)]
[HttpGet("hello")]
public string Hello(ClaimsPrincipal user) => $"Hello {(user.Identity?.Name ?? "world")}!";
}
class MinimumAgeAuthorizeAttribute : AuthorizeAttribute { }
class MinimumAgePolicyProvider : IAuthorizationPolicyProvider { }
class MinimumAgeRequirement : IAuthorizationRequirement { }
class MinimumAgeAuthorizationHandler : AuthorizationHandler<MinimumAgeRequirement> { }
此預(yù)覽引入了IAuthorizationRequirementData
接口,該接口允許屬性定義也指定與授權(quán)策略相關(guān)聯(lián)的要求。通過利用這一變化,我們可以用更少的代碼行重新實(shí)現(xiàn)我們的自定義授權(quán)策略。未刪節(jié)版本包含完整的代碼。
var builder = WebApplication.CreateBuilder();
builder.Services.AddAuthentication().AddJwtBearer();
builder.Services.AddAuthorization();
builder.Services.AddSingleton<IAuthorizationHandler, MinimumAgeAuthorizationHandler>();
var app = builder.Build();
app.MapControllers();
app.Run();
[ApiController]
[Route("api/[controller]")]
public class GreetingsController : Controller
{
[MinimumAgeAuthorize(16)]
[HttpGet("hello")]
public string Hello(ClaimsPrincipal user) => $"Hello {(user.Identity?.Name ?? "world")}!";
}
class MinimumAgeAuthorizeAttribute : AuthorizeAttribute, IAuthorizationRequirement, IAuthorizationRequirementData
{
public MinimumAgeAuthorizeAttribute(int age) => Age =age;
public int Age { get; }
public IEnumerable<IAuthorizationRequirement> GetRequirements()
{
yield return this;
}
}
class MinimumAgeAuthorizationHandler : AuthorizationHandler<MinimumAgeAuthorizeAttribute>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MinimumAgeAuthorizeAttribute requirement) { ... }
}
ASP.NET Core metrics
Metrics 是隨著時(shí)間的推移報(bào)告的測量結(jié)果,最常用于監(jiān)控應(yīng)用程序的運(yùn)行狀況和生成警報(bào)。例如報(bào)告失敗 HTTP 請求的計(jì)數(shù)器可以顯示在儀表盤中,或者在失敗超過閾值時(shí)生成警報(bào)。
此預(yù)覽版本使用 System.Diagnostics.Metrics 在整個(gè) ASP.NET Core 中添加了新的指標(biāo)。Metrics 是一個(gè)現(xiàn)代 API,用于報(bào)告和收集有關(guān)應(yīng)用程序的信息。
與現(xiàn)有事件計(jì)數(shù)器相比,Metrics 提供了許多改進(jìn):
- 具有計(jì)數(shù)器、儀表和直方圖的新型測量
- 具有多維價(jià)值的強(qiáng)大報(bào)告
- 通過與 Open Telemetry 標(biāo)準(zhǔn)保持一致,集成到更廣泛的云原生生態(tài)系統(tǒng)中
Metrics 已經(jīng)為 ASP.NET Core 托管、Kestrel 和 SignalR 添加了度量。預(yù)計(jì)未來會有更多的 .NET API 來獲取 metrics。
如果您有興趣嘗試 metrics,我們已將 Grafana 儀表盤組合在一起,用于報(bào)告 Prometheus 收集的 ASP.NET Core metrics。您可以在 aspnetcore-grafana repository 獲取儀表盤,并將其導(dǎo)入到您自己的 Grafana 環(huán)境中。
提供反饋
我們希望您喜歡 .NET 8 中的 ASP.NET Core 預(yù)覽版。請?jiān)?GitHub 上提交 issue 讓我們知道您對這些新改進(jìn)的看法。文章來源:http://www.zghlxwxcb.cn/news/detail-523608.html
感謝您試用 ASP.NET Core!文章來源地址http://www.zghlxwxcb.cn/news/detail-523608.html
到了這里,關(guān)于.NET 8 Preview 4 中的 ASP.NET Core 更新的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!