.NET Core 3.0预览版7中的ASP.NET Core和Blazor更新
.net core 3.0 preview 7现已推出,它包含一系列asp.net core和blazor的新更新。
以下是此预览中的新功能列表:
- 最新的visual studio预览包括.net core 3.0作为默认运行时
- visual studio中的*asp.net核心模板
- 简化的网页模板
- 组件的属性splatting
- typeconverters和泛型的数据绑定支持
- 阐明了哪些指令属性需要html vs c#
- eventcounters
- grpc模板中的https
- grpc客户端改进
- grpc metapackage
- 用于管理grpc代码生成的cli工具
有关其他详细信息和已知问题,请参阅。
开始吧
要在.net core 3.0 preview 7中开始使用asp.net core,请安装.net core 3.0 preview 7 sdk
如果您使用visual studio在windows上,请安装visual studio 2019的最新预览。
注意:.net core 3.0 preview 7需要visual studio 2019 16.3预览1,现在可用!
要安装最新的客户端blazor模板,还请运行以下命令:
dotnet new -i microsoft.aspnetcore.blazor.templates::3.0.0-preview7.19365.7
不再需要安装blazor visual studio扩展,如果您安装了以前的版本,则可以将其卸载。现在,您需要从命令行安装blazor webassembly模板才能使它们显示在visual studio中。
升级现有项目
要将现有的asp.net core应用程序升级到.net core 3.0 preview 7,请按照asp.net core文档中的。
另请参阅asp.net core 3.0 中的重大更改的完整列表。
要将现有的asp.net core 3.0 preview 6项目升级到preview 7:
- 更新microsoft.aspnetcore。*包引用3.0.0-preview7.19365.7。
而已!你应该准备好了。
最新的visual studio预览包括.net core 3.0作为默认运行时
visual studio(16.3)的最新预览更新包括.net core 3.0作为默认的.net core运行时版本。这意味着如果您安装visual studio的最新预览,那么您已经拥有.net core 3.0。默认情况下,新项目将以.net core 3.0为目标
visual studio中的*asp.net core 模板
现在,asp.net core模板在“创建新项目”对话框中显示为visual studio中的*模板。
这意味着您现在可以搜索各种asp.net core模板并按项目类型(web,服务,库等)进行筛选,以找到您要使用的模板。
简化的网页模板
我们采取了一些措施来进一步简化web应用程序模板,以减少经常被删除的代码量。
特别:
- 默认情况下,cookie同意ui不再包含在web应用程序模板中。
- 脚本和相关的静态资产现在被引用为本地文件,而不是基于当前环境使用cdn。
我们将根据需要提供样本和文档,以便将这些功能添加到新应用程序中。
组件的属性splatting
除了组件声明的参数之外,组件现在还可以捕获和呈现其他属性。可以在字典中捕获其他属性,然后使用新的@attributes
razor指令将其“splat”到元素上,作为组件渲染的一部分。在定义生成支持各种自定义的标记元素的组件时,此功能特别有用。例如,如果您正在定义一个生成<input>
元素的组件,那么定义所有<input>
支持的属性maxlength
或placeholder
组件参数将非常繁琐。
接受任意参数
以限定一个接受任意属性定义使用的成分参数的组件[parameter]
与属性captureunmatchedvalues
设置为true属性。参数的类型必须可从中分配dictionary<string, object>
。这意味着ienumerable<keyvaluepair<string, object>>
或者ireadonlydictionary<string, object>
也是选项。
@code { [parameter(captureunmatchedvalues= true)] dictionary<string, object> attributes { get; set; } }
该captureunmatchedvalues
物业在[parameter]
允许的参数匹配不匹配任何其他参数的所有属性。组件只能定义单个参数captureunmatchedvalues
。
使用@attributes呈现任意属性
组件可以使用@attributes
directive属性将任意属性传递给另一个组件或标记元素。该@attributes
指令允许您指定要传递给标记元素或组件的属性集合。这很有价值,因为指定为属性的键值对集合可以来自.net集合,不需要在组件的源代码中指定。
<input class="form-field" @attributes="attributes" type="text" /> @code { [parameter(captureunmatchedvalues = true)] dictionary<string, object> attributes { get; set; } }
使用该@attributes
指令,attribute
属性的内容将“splatted”到输入元素上。如果这导致重复属性,则属性的评估从左到右进行。在上面的例子中,如果attributes
还包含一个值,class
它将取代class="form-field"
。如果attributes
包含type
那个将被取代的值type="text"
。
typeconverters和泛型的数据绑定支持
blazor现在支持数据绑定到具有字符串的类型typeconverter
。许多内置框架类型,例如guid
并且timespan
有一个字符串typeconverter
,或者您可以typeconverter
自己定义带有字符串的自定义类型。这些类型现在可以与数据绑定无缝协作:
<input @bind="guid" /> <p>@guid</p> @code { guid guid; }
数据绑定现在也适用于泛型。在通用组件中,您现在可以绑定到使用泛型类型参数指定的类型。
@typeparam t <input @bind="value" /> <p>@value</p> @code { t value; }
阐明了哪些指令属性需要html vs c#
在preview 6中,我们引入了指令属性作为razor编译器相关功能的通用语法,如指定事件处理程序(@onclick
)和数据绑定(@bind
)。在此更新中,我们清理了哪些内置指令属性需要c#和html。具体来说,事件处理程序现在需要c#值,因此@
在指定事件处理程序值时不再需要前导字符:
@* before *@ <button @onclick="@onclick">click me</button> @* after *@ <button @onclick="onclick">click me</button>
eventcounters
代替windows性能计数器,.net core引入了一种通过eventcounters发出指标的新方法。在preview7中,我们现在发出eventcounters asp.net core。您可以使用dotnet counters
全局工具查看我们发出的指标。
dotnet counters
通过运行以下命令安装最新预览:
dotnet tool install --global dotnet-counters --version 3.0.0-preview7.19365.2
主机
hosting eventsourceprovider(microsoft.aspnetcore.hosting
)现在发出以下请求计数器:
requests-per-second
total-requests
current-requests
failed-requests
signalr
除托管外,signalr(microsoft.aspnetcore.http.connections
)还会发出以下连接计数器:
connections-started
connections-stopped
connections-timed-out
connections-duration
要查看asp.net core发出的所有计数器,您可以启动dotnet计数器并指定所需的提供程序。下面的示例显示了订阅microsoft.aspnetcore.hosting
和system.runtime
提供者发出的事件时的输出。
dotnet counters monitor -p <pid> microsoft.aspnetcore.hosting system.runtime
npm中signalr的javascript客户端的新软件包id
在azure的signalr服务可以更容易non-.net开发商利用signalr的实时功能。我们从希望通过azure signalr服务启用signalr应用程序的潜在客户那里得到的一个常见问题是“它只适用于asp.net吗?”asp.net核心signalr的前身份 - 其中包括@aspnet
组织npm,进一步混淆了新的signalr用户。
为了缓解这种混淆,从3.0.0-preview7开始,signalr javascript客户端将从更改@aspnet/signalr
为@microsoft/signalr
。要对此更改做出反应,您需要更改package.json文件,require语句和ecmascript import语句中的引用。如果您有兴趣提供有关此移动的反馈或了解思考过程,团队会对此github问题做出更改,阅读和/或贡献,团队与社区进行公开讨论。
新的可定制signalr hub方法授权
使用preview 7,当集线器方法需要授权时,signalr现在为授权处理程序提供自定义资源。资源是一个实例hubinvocationcontext
。的hubinvocationcontext
包括hubcallercontext
,被调用的方法集线器的名称和参数传递给轮毂的方法。
考虑允许通过azure active directory进行多个组织登录的聊天室示例。拥有microsoft帐户的任何人都可以登录聊天,但只有拥有组织的成员才能禁止用户或查看用户的聊天记录。此外,我们可能希望限制某些用户的某些功能。使用预览7中的更新功能,这是完全可能的。请注意该如何domainrestrictedrequirement
作为自定义iauthorizationrequirement
。现在hubinvocationcontext
传入资源参数,内部逻辑可以检查调用hub的上下文,并决定允许用户执行各个hub方法。
public class domainrestrictedrequirement : authorizationhandler<domainrestrictedrequirement, hubinvocationcontext>, iauthorizationrequirement { protected override task handlerequirementasync(authorizationhandlercontext context, domainrestrictedrequirement requirement, hubinvocationcontext resource) { if (isuserallowedtodothis(resource.hubmethodname, context.user.identity.name) && context.user != null && context.user.identity != null && context.user.identity.name.endswith("@jabbr.net", stringcomparison.ordinalignorecase)) { context.succeed(requirement); } return task.completedtask; } private bool isuserallowedtodothis(string hubmethodname, string currentusername) { return !(currentusername.equals("bob42@jabbr.net", stringcomparison.ordinalignorecase) && hubmethodname.equals("banuser", stringcomparison.ordinalignorecase)); } }
现在,可以使用代码在运行时需要检查的策略名称来装饰各个hub方法。当客户端尝试调用各个hub方法时,domainrestrictedrequirement
处理程序将运行并控制对方法的访问。根据domainrestrictedrequirement
控件访问的方式,所有登录用户都应该能够调用该sendmessage
方法,只有使用@jabbr.net
电子邮件地址登录的用户才能查看用户的历史记录,并且 - 除了bob42@jabbr.net
- 将是能够禁止用户进入聊天室。
[authorize] public class chathub : hub { public void sendmessage(string message) { } [authorize("domainrestricted")] public void banuser(string username) { } [authorize("domainrestricted")] public void viewuserhistory(string username) { } }
创建domainrestricted
策略就像使用授权中间件进行连接一样简单。在startup.cs
,添加新策略,将自定义domainrestrictedrequirement
要求作为参数提供。
services .addauthorization(options => { options.addpolicy("domainrestricted", policy => { policy.requirements.add(new domainrestrictedrequirement()); }); });
必须注意的是,在这个例子中,domainrestrictedrequirement
该类不仅是一个,iauthorizationrequirement
而且也是它自己authorizationhandler
的要求。可以将它们分成单独的类来分离关注点。然而,通过这种方式,没有必要注入authorizationhandler
期间startup
,因为需求和处理程序是相同的,所以不需要单独注入处理程序。
grpc模板中的https
grpc模板现已更新为默认使用https。在开发时,我们继续使用该dotnet dev-certs
工具生成的相同证书,在生产过程中,您仍需要提供自己的证书。
grpc客户端改进
托管的grpc客户端(grpc.net.client
)已更新为目标.net standard 2.1,不再依赖于仅存在于.net core 3.0中的类型。这可能使我们能够在将来在其他平台上运行。
grpc metapackage
在3.0.0-preview7中,我们引入了一个新的包grpc.aspnetcore
,它可以传递地引用构建grpc项目所需的所有其他运行时和工具依赖性。推理元数据包的单个包版本应该使开发人员更容易处理,而不是独立版本的多个依赖项。
用于管理grpc代码生成的cli工具
新的dotnet-grpc
全局工具使管理protobuf文件及其代码生成设置变得更加容易。全局工具管理添加和删除protobuf文件以及添加构建和运行grpc应用程序所需的必需包引用。
dotnet-grpc
通过运行以下命令安装最新预览:
dotnet tool install --global dotnet-grpc --version 0.1.22-pre2
例如,您可以运行以下命令来生成protobuf文件,并将其添加到项目中以生成代码。如果您在非web项目上尝试此操作,我们将默认生成客户端并添加所需的包依赖项。
dotnet new proto -o .\protos\mailbox.proto dotnet grpc add-file .\protos\mailbox.proto
上一篇: 古代大多数皇帝都寿命短,背后原因是什么?
推荐阅读
-
创建基于ASP.NET core 3.1 的RazorPagesMovie项目(三)-已搭建基架的Razor页面解释和更新
-
.NET Core 3.0预览版7中的ASP.NET Core和Blazor更新
-
.NET Core 3.0 Preview 6中对ASP.NET Core和Blazor的更新
-
创建基于ASP.NET core 3.1 的RazorPagesMovie项目(三)-已搭建基架的Razor页面解释和更新
-
.NET Core 3.0预览版7中的ASP.NET Core和Blazor更新
-
.NET Core 3.0 Preview 6中对ASP.NET Core和Blazor的更新