.NET 7 预览版2 中的 ASP.NET Core 更新
.NET 7 预览版2 现已推出,其中包括对ASP.NET Core 的许多重大改进。
以下是此预览版中新增内容的摘要:
- 推断来自服务的API 控制器操作参数
- SignalR 集线器方法的依赖注入
- 为minimal API 提供端点描述和摘要
- 在最小的API 中绑定来自标头和查询字符串的数组和StringValue
- 自定义cookie 同意值
有关为.NET 7 计划的ASP.NET Core 工作的更多详细信息,请参阅GitHub 上的.NET 7 的完整ASP.NET Core 路线图。
开始使用
要开始使用.NET 7 Preview 2 中的ASP.NET Core,请安装.NET 7 SDK。
如果您在Windows 上使用Visual Studio,我们建议安装最新的Visual Studio 2022 预览版。Visual Studio for Mac 对.NET 7 预览的支持尚不可用,但即将推出。
要安装最新的.NET WebAssembly 构建工具,请从提升的命令提示符处运行以下命令:
dotnet workload install wasm-tools
升级现有项目
要将现有的ASP.NET Core 应用从.NET 7 Preview 1 升级到.NET 7 Preview 2:
- 将所有Microsoft.AspNetCore.* 包引用更新到7.0.0-preview.2.*。
- 将所有Microsoft.Extensions.* 包引用更新到7.0.0-preview.2.*。
另请参阅.NET 7 的ASP.NET Core 中的重大更改的完整列表。
推断来自服务的API 控制器操作参数
当类型配置为服务时,API 控制器操作的参数绑定现在通过依赖注入绑定参数。 这意味着不再需要将[FromServices] 属性显式应用于参数。
Services.AddScoped<SomeCustomType>();
[Route("[controller]")]
[ApiController]
public class MyController : ControllerBase
{
// Both actions will bound the SomeCustomType from the DI container
public ActionResult GetWithAttribute([FromServices]SomeCustomType service) => Ok();
public ActionResult Get(SomeCustomType service) => Ok();
}
您可以通过设置 DisableImplicitFromServicesParameters 来禁用该功能:
Services.Configure<ApiBehaviorOptions>(options =>
{
options.DisableImplicitFromServicesParameters = true;
})
您可以通过设置DisableImplicitFromServicesParameters 来禁用该功能:
Services.Configure<ApiBehaviorOptions>(options =>
{
options.DisableImplicitFromServicesParameters = true;
})
SignalR 集线器方法的依赖注入
SignalR 集线器方法现在支持通过依赖注入(DI) 注入服务。
Services.AddScoped<SomeCustomType>();
public class MyHub : Hub
{
// SomeCustomType comes from DI by default now
public Task Method(string text, SomeCustomType type) => Task.CompletedTask;
}
您可以通过设置DisableImplicitFromServicesParameters 来禁用该功能:
services.AddSignalR(options =>
{
options.DisableImplicitFromServicesParameters = true;
});
要显式标记要从配置的服务绑定的参数,请使用[FromServices] 属性:
public class MyHub : Hub
{
public Task Method(string arguments, [FromServices] SomeCustomType type);
}
为Minimal API 提供端点描述和摘要
Minimal API 现在支持使用用于OpenAPI 规范生成的描述和摘要来注释操作。 您可以使用扩展方法在Minimal API 应用程序中为路由处理程序设置这些描述和摘要:
app.MapGet("/hello", () => ...)
.WithDescription("Sends a request to the backend HelloService to process a greeting request.");
或者通过路由处理程序委托上的属性设置描述或摘要:
app.MapGet("/hello", [EndpointSummary("Sends a Hello request to the backend")]() => ...)
在Minimal API 中绑定来自标头和查询字符串的数组和StringValue
在此版本中,您现在可以将HTTPS 标头和查询字符串中的值绑定到原始类型数组、字符串数组或StringValues:
// Bind query string values to a primitive type array
// GET /tags?q=1&q=2&q=3
app.MapGet("/tags", (int[] q) => $"tag1: {q[0]} , tag2: {q[1]}, tag3: {q[2]}")
// Bind to a string array
// GET /tags?names=john&names=jack&names=jane
app.MapGet("/tags", (string[] names) => $"tag1: {names[0]} , tag2: {names[1]}, tag3: {names[2]}")
// Bind to StringValues
// GET /tags?names=john&names=jack&names=jane
app.MapGet("/tags", (StringValues names) => $"tag1: {names[0]} , tag2: {names[1]}, tag3: {names[2]}")
您还可以将查询字符串或标头值绑定到复杂类型的数组,只要该类型具有TryParse 实现,如下例所示。
// Bind query string values to a primitive type array
// GET /tags?q=1&q=2&q=3
app.MapGet("/tags", (int[] q) => $"tag1: {q[0]} , tag2: {q[1]}, tag3: {q[2]}")
// Bind to a string array
// GET /tags?names=john&names=jack&names=jane
app.MapGet("/tags", (string[] names) => $"tag1: {names[0]} , tag2: {names[1]}, tag3: {names[2]}")
// Bind to StringValues
// GET /tags?names=john&names=jack&names=jane
app.MapGet("/tags", (StringValues names) => $"tag1: {names[0]} , tag2: {names[1]}, tag3: {names[2]}")
自定义cookie 同意值
您现在可以使用新的CookiePolicyOptions.ConsentCookieValue 属性指定用于跟踪用户是否同意cookie 使用策略的值。
感谢@daviddesmet贡献了这项改进!
请求有关IIS 卷影复制的反馈
在.NET 6 中,我们为IIS 的ASP.NET Core 模块(ANCM) 添加了对影子复制应用程序程序集的实验性支持。 当ASP.NET Core 应用程序在Windows 上运行时,二进制文件被锁定,因此无法修改或替换它们。 您可以通过部署应用程序离线文件来停止应用程序,但有时这样做不方便或不可能。 卷影复制允许在应用程序运行时通过复制程序集来更新应用程序程序集。
您可以通过在web.config 中自定义ANCM 处理程序设置来启用卷影复制:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<handlers>
<remove name="aspNetCore"/>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified"/>
</handlers>
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".logsstdout">
<handlerSettings>
<handlerSetting name="experimentalEnableShadowCopy" value="true" />
<handlerSetting name="shadowCopyDirectory" value="../ShadowCopyDirectory/" />
</handlerSettings>
</aspNetCore>
</system.webServer>
</configuration>
我们正在研究使IIS 中的卷影复制成为.NET 7 中ASP.NET Core 的一项功能,并且我们正在寻求有关该功能是否满足用户要求的更多反馈。 如果您将ASP.NET Core 部署到IIS,请尝试使用卷影复制并在GitHub 上与我们分享您的反馈。
给予反馈
我们希望您喜欢.NET 7 中的ASP.NET Core 预览版。通过在GitHub上提交问题,让我们知道您对这些新改进的看法。
感谢您试用ASP.NET Core!
.NET 7 预览版2 中的 ASP.NET Core 更新的更多相关文章
- 【译】.NET 7 预览版 1 中的 ASP.NET Core 更新
原文 | Daniel Roth 翻译 | 郑子铭 .NET 7 预览版 1 现已推出!这是 .NET 下一个主要版本的第一个预览版,其中将包括使用 ASP.NET Core 进行 Web 开发的下一 ...
- .NET Core 3.0预览版7中的ASP.NET Core和Blazor更新
.NET Core 3.0 Preview 7现已推出,它包含一系列ASP.NET Core和Blazor的新更新. 以下是此预览中的新功能列表: 最新的Visual Studio预览包括.NET C ...
- 根据 Power BI Desktop(预览版)中的报表页创建工具提示
根据 Power BI Desktop 中创建的报表页,可创建直观丰富的报表工具提示,这些提示在你将鼠标悬停在视觉对象上时显示. 通过创建用作工具提示的报表页,使自定义工具提示包含视觉对象.图像以及在 ...
- .NET 5 Preview 1中的ASP.NET Core更新 (2020年3月16日)
.NET 5 Preview1现在可用,可以进行评估了! .NET 5将是当前版本. 开始 要在.NET 5.0中开始使用 ASP.NET Core,请安装.NET 5.0 SDK. 如果您使用的是W ...
- .NET 5.0预览版6发布:支持Windows ARM64设备
2020年6月25日,微软dotnet团队在博客宣布了第六个 .NET 5.0 的预览版:https://devblogs.microsoft.com/dotnet/announcing-net-5- ...
- 官宣.NET 6 预览版4
我们很高兴发布 .NET 6 Preview 4.我们现在大约完成了 .NET 6 发布的一半.现在是一个很好的时机,可以再次查看.NET6的完整范围.许多功能都接近最终形式,而其他功能将很快推出,因 ...
- .NET 6 预览版 5 发布
很高兴.NET 6 预览版5终于跟大家见面了.我们现在正处于.NET 6 的后半部分,开始整合一些重要的功能. 例如.NET SDK 工作负载,它是我们.NET 统一愿景的基础,可以支持更多类型的应用 ...
- 官宣 .NET MAUI 预览版 6
最近,我们发布了.NET 多平台应用程序UI (MAUI)的最新进展. 在此版本中,我们全力支持Visual Studio 2022 预览版2.这也标志着我们首次将.NET MAUI 作为工作负载安装 ...
- .NET 6 预览版 7 发布——最后一个预览版
原文:bit.ly/2VJxjxQ 作者:Richard 翻译:精致码农-王亮 说明:文中有大量的超链接,这些链接在公众号文章中被自动剔除,一部分包含超链接列表的小段落被我删减了,如果你对此感兴趣,请 ...
随机推荐
- 6月11日 python学习总结 框架理论
Web框架本质及第一个Django实例 Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web ...
- vue学习过程总结(06) - vue的数据存储store
这个不知道能怎么叫不?现在对这块很迷.以下为个人理解 store是状态管理,是一个对象,有其属性和方法. 常见的值有:state/mutations/actions/getters, 这几个值的意思: ...
- 3、Lambda表达式
Lambda表达式 Lambda表达式(lambda expression),是一种匿名函数,即没有函数名的函数. Lambda表达式不仅在C#中使用,在Java.Phtyon.C++ 中都有使用. ...
- 解决IDEA的plugins安装插件很慢、不成功问题
1.修改hosts文件 路径:C:\Windows\System32\drivers\etc 52.84.224.36 plugins.jetbrains.com 重启IDEA,再次安装插件时,芜湖~ ...
- sem信号量与死锁的边缘
1. 演示一个例子,出现死锁,用strace debug得到 #include<stdio.h> #include<pthread.h> #include<stdlib. ...
- 手把手带你使用Paint in 3D和Photon撸一个在线涂鸦画板
Paint in 3D Paint in 3D用于在游戏内和编辑器里绘制所有物体.所有功能已经过深度优化,在WebGL.移动端.VR 以及更多平台用起来都非常好用! 它支持标准管线,以及 LWRP.H ...
- JDBC-连接Druid数据池
•导入Druid-jar包 •下载地址 链接:https://pan.baidu.com/s/1A3tSCT9BDXkzB7zbukzyPg?pwd=0000 提取码:0000 下载后具体导入操作和这 ...
- 什么时候用断言(assert)?
答:断言在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制.一般来说,断言用于保证程序最基本.关键的正确性.断言检查通常在开发和测试时开启.为了保证程序的执行效率,在软件发布后断言检查通常 ...
- 并发包下常见的同步工具类(CountDownLatch,CyclicBarrier,Semaphore)
在实际开发中,碰上CPU密集且执行时间非常耗时的任务,通常我们会选择将该任务进行分割,以多线程方式同时执行若干个子任务,等这些子任务都执行完后再将所得的结果进行合并.这正是著名的map-reduce思 ...
- 学习Apache(六)
Apache 是一款使用量排名第一的 web 服务器,LAMP 中的 A 指的就是它.由于其开源.稳定.安全等特性而被广泛使用.下边记录了使用 Apache 以来经常用到的功能,做此梳理,作为日常运维 ...