.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("[email protected]", StringComparison.OrdinalIgnoreCase) &&
hubMethodName.Equals("banUser", StringComparison.OrdinalIgnoreCase));
}
}
現在,可以使用程式碼在執行時需要檢查的策略名稱來裝飾各個Hub方法。當客戶端嘗試呼叫各個Hub方法時,DomainRestrictedRequirement
處理程式將執行並控制對方法的訪問。根據DomainRestrictedRequirement
控制元件訪問的方式,所有登入使用者都應該能夠呼叫該SendMessage
方法,只有使用@jabbr.net
電子郵件地址登入的使用者才能檢視使用者的歷史記錄,並且 - 除了[email protected]
- 將是能夠禁止使用者進入聊天室。
[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