1. 程式人生 > >.NET Core 3.0預覽版7中的ASP.NET Core和Blazor更新

.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

除了元件宣告的引數之外,元件現在還可以捕獲和呈現其他屬性。可以在字典中捕獲其他屬性,然後使用新的@attributesRazor指令將其“splat”到元素上,作為元件渲染的一部分。在定義生成支援各種自定義的標記元素的元件時,此功能特別有用。例如,如果您正在定義一個生成<input>元素的元件,那麼定義所有<input>支援的屬性maxlengthplaceholder元件引數將非常繁瑣。

 

接受任意引數

以限定一個接受任意屬性定義使用的成分引數的元件[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呈現任意屬性

元件可以使用@attributesdirective屬性將任意屬性傳遞給另一個元件或標記元素。該@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.HostingSystem.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