.NET 8 Release Candidate 1 (RC1)现已发布,包括许多针对ASP.NET Core的重要改进!

news2025/1/12 1:05:07

这是我们计划在今年晚些时候发布的最终.NET 8版本之前的两个候选版本中的第一个。大部分计划中的功能和变更都包含在这个候选版本中,可以供您尝试使用。您可以在文档中找到完整的ASP.NET Core在.NET 8中的新功能列表。一些领域(尤其是Blazor)仍然有一些重大的变更待完成,我们预计将在下一个.NET 8候选版本中完成这些变更。

以下是此预览版中的新功能摘要:

  • 服务器和中间件
    • 默认情况下禁用HTTP/3
  • API编写
    • 在最小API、MVC和SignalR中支持键入服务
  • Blazor
    • Blazor Web App模板更新
    • 从额外的程序集中发现用于静态服务器呈现的组件
    • 路由改进
    • 触发页面刷新
    • 将任意属性传递给QuickGrid
    • 确定表单字段是否具有相关的验证消息
    • 配置.NET WebAssembly运行时
    • 在预先编译(AOT)编译后修剪.NET IL
  • Identity
    • 移除username属性
  • 单页应用程序(SPA)
    • 标准.NET模板选项
  • 度量

有关ASP.NET Core在.NET 8中计划的更多详细信息,请查看GitHub上的完整ASP.NET Core .NET 8路线图。

开始

要开始使用.NET 8 RC1中的ASP.NET Core,请安装.NET 8 SDK。

如果您使用Windows并使用Visual Studio,我们建议安装最新的Visual Studio 2022预览版。如果您使用Visual Studio Code,则可以尝试新的C# Dev Kit。

升级现有项目

要将现有的ASP.NET Core应用程序从.NET 8预览7升级到.NET 8 RC1:

  • 将您的应用程序的目标框架更新为.net8.0
  • 将所有Microsoft.AspNetCore.*包引用更新为.8.0.0-rc.1.*
  • 将所有Microsoft.Extensions.*包引用更新为.8.0.0-rc.1.*

另请参阅ASP.NET Core .NET 8中的破坏性变更的完整列表。

服务器和中间件

默认情况下禁用HTTP/3

Kestrel中默认情况下不再启用HTTP/3。这个更改将Kestrel的HTTP协议行为恢复到.NET 7状态,但不同于所有.NET 8预览版本。

我们之所以恢复到.NET 7的行为,是因为启用HTTP/3会导致某些防病毒软件在启动带有调试的应用程序时提示是否允许网络访问。这不是一个良好的体验,因此在我们改进开发人员体验之前,我们将默认情况下禁用HTTP/3。

您可以通过设置您的端点允许的协议来为每个端点重新启用HTTP/3:

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.ListenAnyIP(5001, listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
        listenOptions.UseHttps();
    });
});

或者,通过配置默认协议来重新启用HTTP/3:

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.ConfigureEndpointDefaults(listenOptions =>
    {
        listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
        listenOptions.UseHttps();
    });
});

有关HTTP/3要求和配置的更多信息,请参阅在ASP.NET Core Kestrel Web服务器中使用HTTP/3。

API编写

在最小API、MVC和SignalR中支持键入服务

在.NET 8预览7中,我们引入了对DI中键入服务的支持。从.NET 8 RC1开始,可以在使用最小API、基于控制器的API和SignalR中使用键入服务。要利用新的键入服务支持,请使用属性注释目标参数[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需求。您现在可以根据请求静态地从服务器呈现Blazor组件,逐渐增强体验,增强导航和表单处理,流式服务器呈现更新,并根据需要添加丰富的交互性,使用Blazor Server或Blazor WebAssembly。为了优化应用程序的加载时间,Blazor还可以在运行时自动选择是使用Blazor Server还是Blazor WebAssembly。

这些新的Blazor功能现在都已由Blazor Web App项目模板为您设置。在此版本中,Blazor Web App模板已进行清理和改进,具有几个用于配置不同场景的新选项。

Blazor Web App现在具有以下选项:

  • 使用交互式WebAssembly组件:启用对交互式WebAssembly渲染模式的支持,基于Blazor WebAssembly。
  • 使用交互式Server组件:启用对交互式Server渲染模式的支持,基于Blazor Server。
  • 包括示例页面:如果选择此选项,项目将包括基于Bootstrap样式的示例页面和布局。如果只想要一个空项目来开始,可以禁用此选项。

如果同时选择了WebAssembly和Server渲染模式,那么模板将使用自动渲染模式。自动渲染模式将在下载.NET运行时和应用程序包到浏览器时首先使用Server模式。一旦运行时下载完成,自动模式将切换开始使用WebAssembly渲染模式。

默认情况下,Blazor Web App模板将在单个项目中启用静态和交互式服务器呈现。如果还启用了WebAssembly渲染模式,则项目将包括一个额外的客户端项目,用于您的基于WebAssembly的组件。来自客户端项目的构建输出将下载到浏览器并在客户端上执行。使用WebAssembly或Auto渲染模式的任何组件必须从客户端项目构建。

Blazor Web App模板具有清理的文件结构:

  • 新的Components文件夹包含服务器项目中的所有组件。
  • Components/Layout文件夹包含应用程序布局。
  • Components/Pages文件夹包含可路由的页面组件。

组件名称和内容已进行了清理,以匹配其功能:

  • Index.razor -> Home.razor
  • Counter.razor未更改
  • FetchData.razor -> Weather.razor

组件现在更加简洁和简单: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>

我们对模板中的组件进行了几处更改:App

  • 我们移除了Bootstrap图标,并切换为自定义SVG图标。
  • 我们将Blazor路由器移动到了新的组件,并移除了其参数,因为它从未被使用过。Routes
  • 我们将默认的Blazor错误UI移到了组件中。MainLayout
  • 我们移除了Blazor脚本标签上的属性,因为不再需要。supress-error
  • 新组件模板简化了使整个应用程序具有交互性的过程:只需将所需的渲染模式应用于RoutesHeadOutlet组件。根组件需要是静态的,因为它呈现Blazor脚本,脚本标记不能动态删除。您还不能直接从组件使Blazor路由器具有交互性,因为它具有渲染片段参数,这些参数不可序列化。从静态组件渲染的交互组件必须具有可序列化的参数。Routes
  • Routes
  • HeadOutlet
  • App
  • App
  • Routes

从额外的程序集中发现静态服务器呈现的组件

您现在可以使用方法AddAdditionalAssemblies()配置用于发现静态服务器呈现的Blazor组件的额外程序集:

app.MapRazorComponents<App>()
    .AddAdditionalAssemblies(typeof(Counter).Assembly);

路由改进

我们已将Blazor路由实现与ASP.NET Core路由统一。此统一为Blazor路由器添加了以下功能的支持:

  • 复杂段("/a{b}c{d}"
  • 默认值("/{tier=free}"
  • 所有内置的路由约束

触发页面刷新

您现在可以调用NavigationManager.Refresh()以触发页面刷新。这将使用增强的页面导航(

如果可能)来刷新页面。否则,它将触发完整的页面刷新。要强制执行完整的页面刷新,请使用NavigationManager.Refresh(forceReload: true)

将任意属性传递给QuickGrid

组件现在将任何额外的属性传递给呈现的元素:QuickGrid

<QuickGrid Items="@FilteredPeople" custom-attribute="somevalue" class="custom-class-attribute">

感谢@ElderJames的贡献!

确定表单字段是否具有相关的验证消息

新API可以用于确定字段是否有效,而无需获取验证消息:EditContext.IsValid(FieldIdentifier)

感谢@ElderJames的贡献!

配置.NET WebAssembly运行时

您现在可以在运行时配置WebAssembly上运行时的各种.NET运行时选项,使用函数configureRuntime

<script>
  Blazor.start({
    configureRuntime: dotnet => {
        dotnet.withEnvironmentVariable("CONFIGURE_RUNTIME", "true");
    }
  });
</script>

现在可以从.Blazor.runtime访问.NET运行时实例。

有关在WebAssembly上运行时的.NET运行时选项和API的更多详细信息,请参阅https://github.com/dotnet/runtime/blob/main/src/mono/wasm/runtime/dotnet.d.ts。

在预先编译(AOT)编译后修剪.NET IL

新的MSBuild选项可以在执行预先编译(AOT)编译到WebAssembly后删除编译方法的.NET IL。此新的修剪模式根据我们的测试将_framework文件夹的大小减小了1.7%到4.2%。

<PropertyGroup>
  <RunAOTCompilation>true</RunAOTCompilation>
  <WasmStripILAfterAOT>true</WasmStripILAfterAOT>
</PropertyGroup>

此设置将修剪大多数编译方法的IL代码,包括库中的方法和应用程序中的方法。并非所有编译方法都可以修剪,因为一些方法仍然需要.NET解释器在运行时使用。

如果在使用此新的修剪选项时遇到任何问题,用于AOT编译的WebAssembly应用程序,请通过在dotnet/runtime repo的GitHub上提出问题来告诉我们。

Identity

移除username属性

为了简化映射的身份API并更紧密地与现有的Identity UI对齐,已移除了username属性。现在,用户名和电子邮件是相同的,并且字段将在将来的命名中使用(或在注册用户时)。username -> Email -> NewEmail

单页应用程序(SPA)

标准.NET模板选项

Visual Studio模板用于使用ASP.NET Core与流行的前端JavaScript框架(如Angular、React和Vue)现在支持标准的.NET模板选项,包括指定目标.NET框架版本、启用OpenAPI支持等等。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

度量

在.NET 8 RC1中,我们已将新的度量重命名为遵循OpenTelemetry Semantic Conventions。这个更改基于用户和库作者关于如何命名其自己的计数器的反馈。OpenTelemetry是一种现有的已建立标准,.NET的内置度量和更广泛的.NET生态系统遵循该标准是有益的。

  • ASP.NET Core的主要HTTP度量现在与OpenTelemetry的http.server.request.durationhttp.server.active_requests计数器完全匹配。
  • ASP.NET Core中的其他计数器使用语义约定的命名标准。例如,速率限制中间件有度量标识HTTP请求等待租约和租约持续时间的数量。
    • 将租约队列长度计数器从`rate-limiting

.enqueued-requests重命名为rate_limiting.queued_requests`。

  • 将HTTP请求数计数器从rate-limiting.current-requests重命名为rate_limiting.concurrent_requests
  • 将HTTP限制失败的请求数计数器从rate-limiting.denied-requests重命名为rate_limiting.denied_requests
  • ASP.NET Core的DNS解析度量现在与OpenTelemetry的dns.resolver.query_durationdns.resolver.query_count计数器完全匹配。
  • 度量名称更改可能会影响与度量名称一起记录的数据。

我们已将命名的度量计数器添加到ASP.NET Core度量文档中。

已知问题

ASP.NET Redis基于输出缓存

在ASP.NET中,基于Redis的输出缓存存在已知的回归问题(在.NET 8中首次引入,在Preview 6中宣布);此功能在RC1中将无法工作。已经找到了原因,并在RC2中解决了此问题。

Blazor Web App模板创建多个计数器组件

Blazor Web App在启用交互式WebAssembly组件时采用了不必要的解决方案。模板生成了两个组件:1. 在客户端项目中带有渲染模式属性的组件,2. 服务器项目中使用客户端组件的页面。这个解决方案是不必要的。可以在将其指令复制到客户端项目后,将服务器项目中的组件删除。然后在Program.cs中调用Counter以便可以发现该组件。`

提供反馈

我们希望您喜欢在.NET 8中的ASP.NET Core的这个预览版本。通过在GitHub上提交问题来告诉我们您对这些新改进的看法。

感谢您尝试ASP.NET Core!

原文: https://devblogs.microsoft.com/dotnet/asp-net-core-updates-in-dotnet-8-rc-1/#servers

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1017120.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMvc第六战-【SpringMvcJSON返回异常处理机制】

前言&#xff1a; 小编讲述了&#xff1a;JSR303的概念&#xff0c;应用场景和在具体实例的使用&#xff1b;和拦截器的应用 今天小编来讲述的为cJSON返回&异常处理机制&#xff0c;json返回就不用多说&#xff0c;毕竟大部分数据都是通过Json来传递数据的&#xff0c;异…

elasticsearch4-文档操作

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;三人行&#xff0c;必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》&#xff0c;SpringCloud…

VSCode 安装使用教程 环境安装配置 保姆级教程

一个好用的 IDE 不仅能提升我们的开发效率&#xff0c;还能让我们保持愉悦的心情&#xff0c;这样才是非常 Nice 的状态 ^_^ 那么&#xff0c;什么是 IDE 呢 &#xff1f; what IDE&#xff08;Integrated Development Environment&#xff0c;集成开发环境&#xff09;是含代码…

Python实现四维图像绘制系统

文章目录 动图绘制系统的实现播放控制接口优化总结 Python绘图系统&#xff1a; 源码地址&#xff1a;Python打造动态绘图系统&#x1f4c8;从0开始的3D绘图系统&#x1f4c9;一套3D坐标&#xff0c;多个函数&#x1f4ca;散点图、极坐标和子图自定义控件&#xff1a;绘图风格…

Modbus协议介绍及Modbus TCP

这里写目录标题 一、Modbus起源1.起源2.分类3.优势4.应用场景5.ModbusTCP特点⭐⭐⭐ 二、Modbus TCP协议格式1.报文头2.寄存器3.功能码4.协议包书写模板总结 一、Modbus起源 1.起源 Modbus由Modicon公司于1979年开发&#xff0c;是一种工业现场总线协议标准。 Modbus通信协议…

网络存储解决方案:选择与配置

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

03MyBatis-Plus中的常用注解

常用注解 TableName MyBatis-Plus根据BaseMapper中指定的泛型(实体类型名)确定数据库中操作的表,如果根据实体类型名找不到数据库中对应的表则会报表不存在异常 //向表中插入一条数据 Test public void testInsert(){User user new User(null, "张三", 23, "…

基于Java+SpringBoot+Vue+uniapp点餐小程序(亮点:协同过滤算法、会员系统,购物车结算、在线聊天)

校园点餐小程序 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序&#xff08;小蔡coding&#xff09;2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 系统功能结构设计4.2 主要功能描述 五…

【操作系统】深入浅出死锁问题

死锁的概念 在多线程编程中&#xff0c;我们为了防止多线程竞争共享资源而导致数据错乱&#xff0c;都会在操作共享资源而导致数据错乱&#xff0c;都会在操作共享资源之前加上互斥锁&#xff0c;只有成功获得到锁的线程&#xff0c;才能操作共享资源&#xff0c;获取不到锁的…

Python新手入门

文章目录 概要python代码运行结果小结 概要 以下内容为python各种输出语句的语法&#xff01; python代码 # 标准化输出 print("这是标准化输出&#xff01;")# 格式化输出 print("这是第1种%s"%"格式化输出&#xff01;") print("这是第…

牛客小白月赛 78

比赛地址 : 牛客小白月赛78 A.几何糕手 题目链接 : 几何糕手 题面 : 思路 : 数学模拟题; 最大面积就是在a与b成一条直线的情况下&#xff1b; so : 输出pi * (ab) * (ab)即可 注意 : 注意精度!!! 代码 : #include<iostream> #include<algorithm> u…

STM32--PWR电源控制

文章目录 PWR电源电源管理器上电复位&#xff08;POR&#xff09;和掉电复位&#xff08;PDR&#xff09; 可编程电压监测器&#xff08;PVD&#xff09;低功耗模式睡眠模式停止模式待机模式 睡眠模式工程停止模式待机模式 PWR STM32的PWR模块是其电源管理系统的核心部分&…

JDK12特性

文章目录 JAVA12概述语法层次的改变switch 表达式(预览) API层次的改变支持数字压缩格式化String新方法Files新增mismatch方法 关于GC的特性Shenandoah GC可中断的 G1 Mixed GC增强G1 JAVA12概述 2019年3月19日&#xff0c;java12正式发布了&#xff0c;总共有8个新的JEP(JDK …

005-第一代光电小工具(一)

第一代光电小工具(一) 文章目录 第一代光电小工具(一)项目介绍大致原理描述核心控件QCustomPlot关于QCustomPlot 播放音频软件截图 关键字&#xff1a; Qt、 Qml、 QCustomPlot、 曲线、 SQLite 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&…

【Spring Boot】Spring—加载监听器

这里写目录标题 前言加载监听器执行run方法加载配置文件封装Node调用构造器思考 前言 前几天的时候&#xff0c;项目里有一个需求&#xff0c;需要一个开关控制代码中是否执行一段逻辑&#xff0c;于是理所当然的在yml文件中配置了一个属性作为开关&#xff0c;再配合nacos就可…

Prometheus黑盒测试模块,监控TCP端口+ HTTP/HTTPS路由状态

文章目录 一、黑盒测试使用场景二、安装blackbox-exporter三、监控TCP端口四、监控HTTP/HTTPS路由五、最后分享几款Grafana模板 一、黑盒测试使用场景 官方下载地址 blackbox-exporter是Prometheus官方提供的一个黑盒测试的解决方案&#xff0c;可用于以下使用场景&#xff1a…

LLaMA参数微调方法

1.Adapter Tuning&#xff1a;嵌入在transformer中 新增了一个名为adapter的结构&#xff0c;其核心思想是保持模型其他原始参数不变&#xff0c;只改变adapter的参数&#xff0c;其结构如下图所示&#xff1a; 1.在每一个transformer模块最后都加入一层adapter。 2.adapter首…

Valine表白动态心跳源码

动态心跳源码 给前女友表白写的网页现在用不着喽 &#xff08;主要功能&#xff09; 记录在一起的时长QQ头像自动同步集成随机古诗词Valine留言评论&#xff08;Valine是一款快速、简洁且高效的无后端评论系统&#xff09; 出售源码&#xff1a;50&#xff08;联系方式在图中…

C# Onnx Yolov8 Pose 姿态识别

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System…

HTTP响应详解, HTTP请求构造及HTTPS详解

HTTP响应详解 认识 "状态码" (status code) 状态码表示访问一个页面的结果 . ( 是访问成功 , 还是失败 , 还是其他的一些情况 ...). 以下为常见的状态码 . 200 OK 这 是一个最常见的状态码, 表示访问成功 . 抓包抓到的大部分结果都是 200 例如访问搜狗…