.NET Core 3.0 Preview 6中对ASP.NET Core和Blazor的更新
我們都知道在6月12日的時(shí)候微軟發(fā)布了.NET Core 3.0的第6個(gè)預(yù)覽版。針對(duì).NET Core 3.0的發(fā)布我們國(guó)內(nèi)的微軟MVP-汪宇杰還發(fā)布的官翻版的博文進(jìn)行了詳細(xì)的介紹。具體的可以關(guān)注“汪宇杰博客”公眾號(hào),或者我的“DotNetCore實(shí)戰(zhàn)”公眾號(hào)然后在歷史文章里面進(jìn)行查閱。而我們這篇文章將會(huì)介紹本次更新中對(duì)ASP.NET Core和Blazor所做的更新。當(dāng)然本文的大部分內(nèi)容翻譯自ASP.NET的首席項(xiàng)目經(jīng)理Daniel Roth的介紹。
注:英語(yǔ)能力好的可以直接到文章末尾查看英文鏈接進(jìn)行閱讀。
作者:依樂(lè)祝
本文鏈接:https://www.cnblogs.com/yilezhu/p/11031441.html
以下是此預(yù)覽版中的新增功能列表:
- 新Razor特性:@attribute,@code,@key,@namespace,@functions中的標(biāo)記
- Blazor指令屬性
- Blazor應(yīng)用程序的身份驗(yàn)證和授權(quán)支持
- Razor類(lèi)庫(kù)中的靜態(tài)資產(chǎn)
- Json.NET不再在項(xiàng)目模板中引用
- 證書(shū)和Kerberos身份驗(yàn)證
- SignalR自動(dòng)重新連接
- 托管gRPC客戶(hù)端
- gRPC客戶(hù)端工廠(chǎng)
- gRPC攔截器
有關(guān)其他詳細(xì)信息和已知問(wèn)題,請(qǐng)參閱發(fā)行說(shuō)明。
開(kāi)始
要在.NET Core 3.0 Preview 6中開(kāi)始使用ASP.NET Core,請(qǐng)安裝.NET Core 3.0 Preview 6 SDK
如果您在Windows上使用Visual Studio進(jìn)行的話(huà),則還需要安裝Visual Studio 2019的最新預(yù)覽。
對(duì)于最新的客戶(hù)端Blazor模板,還可以從Visual Studio Marketplace 安裝最新的Blazor擴(kuò)展。
升級(jí)現(xiàn)有項(xiàng)目
要將現(xiàn)有的ASP.NET Core應(yīng)用程序升級(jí)到.NET Core 3.0 Preview 6,請(qǐng)按照ASP.NET Core文檔中的遷移步驟進(jìn)行操作。
另請(qǐng)參閱ASP.NET Core 3.0 中的重大更改的完整列表。
要將現(xiàn)有的ASP.NET Core 3.0 Preview 5項(xiàng)目升級(jí)到Preview 6:
- 更新Microsoft.AspNetCore.*包引用到3.0.0-preview6.19307.2
- 在Blazor應(yīng)用程序中:
- 重命名@functions為@code
- 更新Blazor特定屬性和事件處理程序以使用新的指令屬性語(yǔ)法(參見(jiàn)下文)
- 刪除任何關(guān)于app.UseBlazor<TStartup>()的調(diào)用,換成在app.UseRouting()調(diào)用之前調(diào)用app.UseClientSideBlazorFiles<TStartup>()的方式。還要在app.UseEndpoints()的調(diào)用中調(diào)用endpoints.MapFallbackToClientSideBlazor<TStartup>("index.html")。
之前的調(diào)用方式
app.UseRouting();app.UseEndpoints(endpoints => {endpoints.MapDefaultControllerRoute(); });app.UseBlazor<Client.Startup>();更新之后的調(diào)用方式
app.UseClientSideBlazorFiles<Client.Startup>();app.UseRouting();app.UseEndpoints(endpoints => {endpoints.MapDefaultControllerRoute();endpoints.MapFallbackToClientSideBlazor<Client.Startup>("index.html"); });Razor的新特性
我們(因?yàn)槭茿SP.NET的首席項(xiàng)目經(jīng)理Daniel Roth寫(xiě)的博客,所以用第一人稱(chēng))在此版本中添加了對(duì)以下新Razor語(yǔ)言功能的支持。
@attribute
新的@attribute指令將指定的屬性添加到生成的類(lèi)中。
@attribute [Authorize]@code
.razor文件(在.cshtml文件中不支持)中使用了新的@code指令來(lái)指定要作為附加成員添加到生成的類(lèi)中的代碼塊。它相當(dāng)于@functions,但現(xiàn)在有了更好的名稱(chēng)。
@code {int currentCount = 0;void IncrementCount(){currentCount++;} }@key
.razor文件中使用了新的@key指令屬性,以指定Blazor diffing算法可用于保留列表中的元素或組件的值(任何對(duì)象或唯一標(biāo)識(shí)符)。
<div>@foreach (var flight in Flights){<DetailsCard @key="flight" Flight="@flight" />} </div>要了解需要此功能的原因,請(qǐng)想象一下不實(shí)用此功能來(lái)呈現(xiàn)包含航班詳細(xì)信息的卡片列表的場(chǎng)景:
<div>@foreach (var flight in Flights){<DetailsCard Flight="@flight" />} </div>如果將新航班添加到航班列表的中間,則現(xiàn)有的詳細(xì)信息卡實(shí)例應(yīng)保持不受影響,并且應(yīng)在呈現(xiàn)的輸出中插入一個(gè)新的詳細(xì)信息卡。
要想象這個(gè),如果Flights以前包含[F0, F1, F2],那么這是之前的狀態(tài):
- DetailsCard0,Flight = F0
- DetailsCard1,Flight = F1
- DetailsCard2,Flight = F2
......如果我們?cè)谒饕?中插入一個(gè)新的項(xiàng)目fnew,這就是所期望的插入之后的狀態(tài):
- DetailsCard0,Flight = F0
- DetailsCardNew,Flight = FNew
- DetailsCard1,Flight = F1
- DetailsCard2,Flight = F2
但是,實(shí)際插入后的狀態(tài)如下:
- DetailsCard0,Flight = F0
- DetailsCard1,Flight = FNew
- DetailsCard2,Flight = F1
- DetailsCardNew,Flight = F2
系統(tǒng)無(wú)法知道DetailsCard2或DetailsCard3應(yīng)保留它們與舊航班實(shí)例的關(guān)聯(lián),因此它只會(huì)將它們與列表中與其位置匹配的航班重新關(guān)聯(lián)。因此,DetailsCard1和DetailsCard2使用新數(shù)據(jù)完全重建自己,這是浪費(fèi)的,有時(shí)甚至?xí)?dǎo)致用戶(hù)可見(jiàn)問(wèn)題(例如,輸入焦點(diǎn)意外丟失)。
通過(guò)使用@keydiffing算法添加鍵可以關(guān)聯(lián)新舊元素或組件。
@namespace
在*_Imports.razor*文件中使用時(shí),指定生成的類(lèi)或名稱(chēng)空間前綴的名稱(chēng)空間。該@namespace指令現(xiàn)在適用于頁(yè)面和視圖(.cshtml)應(yīng)用程序,但現(xiàn)在它也支持組件(.razor)。
@namespace MyNamespace標(biāo)記@functions和本地功能
在視圖和頁(yè)面(.cshtml文件)中,您現(xiàn)在可以在@functions塊和本地函數(shù)中的方法內(nèi)添加標(biāo)記。
@{ GreetPerson(person); }@functions {void GreetPerson(Person person){<p>Hello, <em>@person.Name!</em></p>} }Blazor指令屬性
Blazor使用各種屬性來(lái)影響組件的編譯方式(例如ref,bind,事件處理程序等)。隨著時(shí)間的推移,這些屬性已經(jīng)有機(jī)地添加到Blazor并使用不同的語(yǔ)法。在這個(gè)Blazor版本中,我們已經(jīng)標(biāo)準(zhǔn)化了指令屬性的通用語(yǔ)法。這使得Blazor使用的Razor語(yǔ)法更加一致和可預(yù)測(cè)。它還為未來(lái)的可擴(kuò)展性鋪平了道路。
指令屬性都遵循以下語(yǔ)法,其中括號(hào)中的值是可選的:
@directive(-suffix(:name))(="value")一些有效的例子:
<!-- directive --> <div @directive>...</div> <div @directive="value"></div><!-- directive with key/value arg--> <div @directive:key>...</div> <div @directive:key="value"></div><!-- directive with suffix --> <div @directive-suffix></div> <div @directive-suffix="value"></div><!-- directive with suffix and key/value arg--> <div @directive-suffix:key></div> <div @directive-suffix:key="value"></div>所有Blazor內(nèi)置指令屬性都已更新為使用此新語(yǔ)法,如下所述。
事件處理程序
在Blazor中指定事件處理程序現(xiàn)在使用新的指令屬性語(yǔ)法而不是普通的HTML語(yǔ)法。語(yǔ)法類(lèi)似于HTML語(yǔ)法,但現(xiàn)在具有前導(dǎo)@字符。這使得C#事件處理程序與JS事件處理程序不同。
<button @onclick="@Clicked">Click me!</button>為C#事件處理程序指定委托時(shí),@屬性值當(dāng)前仍需要前綴,但我們希望在將來(lái)的更新中刪除此要求。
在將來(lái),我們還希望使用指令屬性語(yǔ)法來(lái)支持事件處理程序的其他功能。例如,停止事件傳播可能看起來(lái)像這樣(尚未實(shí)現(xiàn),但它讓您了解現(xiàn)在由指令屬性啟用的方案):
<button @onclick="Clicked" @onclick:stopPropagation>Click me!</button>捆綁
<input @bind="myValue">...</input> <input @bind="myValue" @bind:format="mm/dd">...</input> <MyButton @bind-Value="myValue">...</MyButton>鍵
<div @key="id">...</div>參考
<button @ref="myButton">...</button>Blazor應(yīng)用程序的身份驗(yàn)證和授權(quán)支持
Blazor現(xiàn)在內(nèi)置了對(duì)處理身份驗(yàn)證和授權(quán)的支持。服務(wù)器端Blazor模板現(xiàn)在支持使用ASP.NET Core Identity,Azure AD和Azure AD B2C啟用所有標(biāo)準(zhǔn)身份驗(yàn)證配置的選項(xiàng)。我們還沒(méi)有更新Blazor WebAssembly模板以支持這些選項(xiàng),但我們計(jì)劃在.NET Core 3.0發(fā)布之后這樣做。
要?jiǎng)?chuàng)建啟用了身份驗(yàn)證的新Blazor應(yīng)用程序:
創(chuàng)建一個(gè)新的Blazor(服務(wù)器端)項(xiàng)目,然后選擇鏈接以更改身份驗(yàn)證配置。例如,選擇“個(gè)人用戶(hù)帳戶(hù)”和“在應(yīng)用程序中存儲(chǔ)用戶(hù)帳戶(hù)”以將Blazor與ASP.NET Core Identity一起使用:
運(yùn)行應(yīng)用程序。該應(yīng)用程序包含頂行中的鏈接,用于注冊(cè)為新用戶(hù)并登錄。
選擇“注冊(cè)”鏈接以注冊(cè)新用戶(hù)。
選擇“應(yīng)用遷移”以將ASP.NET Core Identity遷移應(yīng)用于數(shù)據(jù)庫(kù)。
你現(xiàn)在應(yīng)該登錄了。
選擇您的用戶(hù)名以編輯您的用戶(hù)個(gè)人資料。
在Blazor應(yīng)用程序中,Startup使用標(biāo)準(zhǔn)ASP.NET Core中間件在類(lèi)中配置身份驗(yàn)證和授權(quán)。
app.UseRouting();app.UseAuthentication(); app.UseAuthorization();app.UseEndpoints(endpoints => {endpoints.MapControllers();endpoints.MapBlazorHub();endpoints.MapFallbackToPage("/_Host"); });使用ASP.NET Core Identity時(shí),所有與身份相關(guān)的UI問(wèn)題都由框架提供的默認(rèn)身份UI處理。
services.AddDefaultIdentity<IdentityUser>().AddEntityFrameworkStores<ApplicationDbContext>();應(yīng)用程序頂行中的身份驗(yàn)證相關(guān)鏈接使用新的內(nèi)置AuthorizeView組件呈現(xiàn),該組件根據(jù)身份驗(yàn)證狀態(tài)顯示不同的內(nèi)容。
LoginDisplay.razor
<AuthorizeView><Authorized><a href="Identity/Account/Manage">Hello, @context.User.Identity.Name!</a><a href="Identity/Account/LogOut">Log out</a></Authorized><NotAuthorized><a href="Identity/Account/Register">Register</a><a href="Identity/Account/Login">Log in</a></NotAuthorized> </AuthorizeView>該AuthorizeView組件僅在授權(quán)用戶(hù)時(shí)顯示其子內(nèi)容。可替代地,AuthorizeView采用參數(shù)用于指定不同模板當(dāng)用戶(hù)是Authorized,NotAuthorized,或Authorizing。當(dāng)前的身份驗(yàn)證狀態(tài)通過(guò)隱式context參數(shù)傳遞給這些模板。您還可以指定AuthorizeView用戶(hù)必須滿(mǎn)足的特定角色或授權(quán)策略才能查看授權(quán)視圖。
要授權(quán)訪(fǎng)問(wèn)Blazor應(yīng)用程序中的特定頁(yè)面,請(qǐng)使用普通的[authorize]屬性。可以使用新的@attribute指令將[authorize]屬性應(yīng)用于組件。。
@using Microsoft.AspNetCore.Authorization @attribute [Authorize] @page "/fetchdata"要指定在未授權(quán)用戶(hù)或仍處于授權(quán)處理時(shí)需要授權(quán)的頁(yè)面上顯示的內(nèi)容,請(qǐng)使用組件上的NotAuthorizedContent和AuthorizingContent參數(shù)Router。這些Router參數(shù)僅在此版本的客戶(hù)端Blazor中提供支持,但在將來(lái)的更新中將為服務(wù)器端Blazor啟用它們。
AuthenticationStateProvider無(wú)論是在服務(wù)器上運(yùn)行還是在瀏覽器中運(yùn)行客戶(hù)端,新服務(wù)都會(huì)以統(tǒng)一的方式使Blazor應(yīng)用程序可以使用身份驗(yàn)證狀態(tài)。在服務(wù)器端Blazor應(yīng)用程序中AuthenticationStateProvider,用戶(hù)從HttpContext建立與服務(wù)器的連接的表面。客戶(hù)端Blazor應(yīng)用程序可以根據(jù)應(yīng)用程序配置自定義AuthenticationStateProvider。例如,它可以通過(guò)查詢(xún)服務(wù)器上的端點(diǎn)來(lái)檢索當(dāng)前用戶(hù)信息。
Task<AuthenticationState>使用該CascadingAuthenticationState組件將身份驗(yàn)證狀態(tài)作為級(jí)聯(lián)值提供給應(yīng)用程序。然后,AuthorizeView和Router組件使用此級(jí)聯(lián)值來(lái)授權(quán)對(duì)UI的特定部分的訪(fǎng)問(wèn)。
App.razor
<CascadingAuthenticationState><Router AppAssembly="typeof(Startup).Assembly"><NotFoundContent><p>Sorry, there's nothing at this address.</p></NotFoundContent></Router> </CascadingAuthenticationState>Razor類(lèi)庫(kù)中的靜態(tài)資產(chǎn)
Razor類(lèi)庫(kù)現(xiàn)在可以包含靜態(tài)資源,如JavaScript,CSS和圖像。然后,可以通過(guò)引用Razor類(lèi)庫(kù)項(xiàng)目或通過(guò)包引用將這些靜態(tài)資產(chǎn)包含在ASP.NET Core應(yīng)用程序中。
要在Razor類(lèi)庫(kù)中包含靜態(tài)資源,請(qǐng)將一個(gè)wwwroot文件夾添加到Razor類(lèi)庫(kù)中,并在該文件夾中包含所有必需的文件。
當(dāng)具有靜態(tài)資產(chǎn)的Razor類(lèi)庫(kù)被引用為項(xiàng)目引用或作為包時(shí),來(lái)自庫(kù)的靜態(tài)資源在路徑前綴*_content / {LIBRARY NAME} /*下可供應(yīng)用程序使用。靜態(tài)資源保留在其原始文件夾中,Razor類(lèi)庫(kù)中靜態(tài)資產(chǎn)內(nèi)容的任何更改都會(huì)反映在應(yīng)用程序中而不進(jìn)行重建。
發(fā)布應(yīng)用程序后,所有引用的Razor類(lèi)庫(kù)中的伴隨資源將以相同的前綴復(fù)制到已發(fā)布應(yīng)用程序的wwwroot文件夾中。
要嘗試使用Razor類(lèi)庫(kù)中的靜態(tài)資源:
創(chuàng)建默認(rèn)的ASP.NET Core Web App。
dotnet new webapp -o WebApp1創(chuàng)建一個(gè)Razor類(lèi)庫(kù)并從Web應(yīng)用程序引用它。
dotnet new razorclasslib -o RazorLib1 dotnet add WebApp1 reference RazorLib1將wwwroot文件夾添加到Razor類(lèi)庫(kù),并包含一個(gè)JavaScript文件,該文件將簡(jiǎn)單消息記錄到控制臺(tái)。
cd RazorLib1 mkdir wwwroothello.js
console.log("Hello from RazorLib1!");從Web應(yīng)用程序中的Index.cshtml引用腳本文件。
<script src="_content/RazorLib1/hello.js"></script>運(yùn)行應(yīng)用程序并在瀏覽器控制臺(tái)中查找輸出。
Hello from RazorLib1!項(xiàng)目現(xiàn)在默認(rèn)使用System.Text.Json
現(xiàn)在,新的ASP.NET Core項(xiàng)目將默認(rèn)使用System.Text.Json進(jìn)行JSON處理。在此版本中,我們從項(xiàng)目模板中刪除了Json.NET(Newtonsoft.Json)。要啟用對(duì)使用Json.NET的支持,請(qǐng)將Microsoft.AspNetCore.Mvc.NewtonsoftJson包添加到項(xiàng)目中,并AddNewtonsoftJson()在Startup.ConfigureServices方法中添加對(duì)以下代碼的調(diào)用。例如:
services.AddMvc().AddNewtonsoftJson();證書(shū)和Kerberos身份驗(yàn)證
預(yù)覽6為ASP.NET Core帶來(lái)了證書(shū)和Kerberos身份驗(yàn)證。
證書(shū)身份驗(yàn)證要求您將服務(wù)器配置為接受證書(shū),然后在Startup.Configure中添加身份驗(yàn)證中間件和在Startup.ConfigureServices中配置證書(shū)身份驗(yàn)證服務(wù)。
public void ConfigureServices(IServiceCollection services) {services.AddAuthentication(CertificateAuthenticationDefaults.AuthenticationScheme).AddCertificate();// All the other service configuration. }public void Configure(IApplicationBuilder app, IHostingEnvironment env) {app.UseAuthentication();// All the other app configuration. }證書(shū)身份驗(yàn)證選項(xiàng)包括接受自簽名證書(shū),檢查證書(shū)吊銷(xiāo)以及檢查提供的證書(shū)中是否包含正確的使用標(biāo)記的功能。默認(rèn)用戶(hù)主體是從證書(shū)屬性構(gòu)造的,其中包含一個(gè)允許您補(bǔ)充或替換主體的事件。有關(guān)如何為證書(shū)身份驗(yàn)證配置公共主機(jī)的所有選項(xiàng)和說(shuō)明,請(qǐng)參閱文檔。
我們還將“Windows身份驗(yàn)證”擴(kuò)展到Linux和macOS上。以前,此身份驗(yàn)證類(lèi)型僅限于IIS和HttpSys,但現(xiàn)在Kestrel可以使用Microsoft.AspNetCore.Authentication.Negotiate nuget包在Windows,Linux和macOS上為Windows域加入的主機(jī)使用Negotiate,Kerberos和NTLM。與配置身份驗(yàn)證應(yīng)用程序范圍的其他身份驗(yàn)證服務(wù)一樣,然后配置服務(wù):
public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(NegotiateDefaults.AuthenticationScheme).AddNegotiate(); }public void Configure(IApplicationBuilder app, IHostingEnvironment env) {app.UseAuthentication();// All the other app configuration. }必須正確配置主機(jī)。Windows主機(jī)必須將SPN添加到托管應(yīng)用程序的用戶(hù)帳戶(hù)。必須將Linux和macOS計(jì)算機(jī)加入域,然后必須為Web進(jìn)程創(chuàng)建SPN,以及在主機(jī)上生成和配置的keytab文件。文檔中給出了完整的說(shuō)明。
SignalR自動(dòng)重新連接
此預(yù)覽版本現(xiàn)已通過(guò)npm install @aspnet/signalr@next 和.NET Core SignalR Client方式進(jìn)行提供,包括一個(gè)新的自動(dòng)重新連接功能。在這個(gè)版本中,我們已經(jīng)將withAutomaticReconnect()方法添加到了HubConnectionBuilder。默認(rèn)情況下,客戶(hù)端將嘗試立即重新連接,并在2、10和30秒后重新連接。參與自動(dòng)重新連接是可選的,但通過(guò)這種新方法很簡(jiǎn)單。
const connection = new signalR.HubConnectionBuilder().withUrl("/chatHub").withAutomaticReconnect().build();通過(guò)將一系列基于毫秒的持續(xù)時(shí)間傳遞給該方法,您可以非常精細(xì)地了解重新連接嘗試如何隨時(shí)間發(fā)生。
.withAutomaticReconnect([0, 3000, 5000, 10000, 15000, 30000]) //.withAutomaticReconnect([0, 2000, 10000, 30000]) yields the default behavior或者,您可以傳遞自定義重新連接策略的實(shí)現(xiàn),該策略可以讓您完全控制。
如果30秒后重新連接失敗(或您設(shè)置的最大值),客戶(hù)端會(huì)假定連接處于脫機(jī)狀態(tài),并停止嘗試重新連接。在這些重新連接嘗試期間,您將希望更新應(yīng)用程序UI,以向用戶(hù)提供嘗試重新連接的提示。
重新連接事件處理程序
為了簡(jiǎn)化這一過(guò)程,我們將SignalR客戶(hù)端API擴(kuò)展為包含onreconnecting和onreconnected事件處理程序。第一個(gè)處理程序onreconnecting為開(kāi)發(fā)人員提供了一個(gè)禁用UI或讓用戶(hù)知道應(yīng)用程序處于脫機(jī)狀態(tài)的好機(jī)會(huì)。
connection.onreconnecting((error) => {const status = `Connection lost due to error "${error}". Reconnecting.`;document.getElementById("messageInput").disabled = true;document.getElementById("sendButton").disabled = true;document.getElementById("connectionStatus").innerText = status; });同樣,onreconnected處理程序使開(kāi)發(fā)人員有機(jī)會(huì)在重新建立連接后更新UI。
connection.onreconnected((connectionId) => {const status = `Connection reestablished. Connected.`;document.getElementById("messageInput").disabled = false;document.getElementById("sendButton").disabled = false;document.getElementById("connectionStatus").innerText = status; });了解有關(guān)自定義和處理重新連接的詳細(xì)信息
預(yù)覽版本中已經(jīng)部分記錄了自動(dòng)重新連接。請(qǐng)?jiān)L問(wèn)https://aka.ms/signalr/auto-reconnect,查看有關(guān)該主題的更深入的文檔,以及有關(guān)使用的更多示例和詳細(xì)信息。
托管gRPC客戶(hù)端
在之前的預(yù)覽中,我們依靠Grpc.Core庫(kù)來(lái)獲取客戶(hù)端支持。HttpClient在此預(yù)覽中添加HTTP / 2支持使我們能夠引入完全托管的gRPC客戶(hù)端。
要開(kāi)始使用新客戶(hù)端,請(qǐng)?zhí)砑影肎rpc.Net.Client,然后您可以創(chuàng)建新客戶(hù)端。
var httpClient = new HttpClient() { BaseAddress = new Uri("https://localhost:5001") }; var client = GrpcClient.Create<GreeterClient>(httpClient);gRPC客戶(hù)端工廠(chǎng)
基于我們介紹的固定模式HttpClientFactory,我們添加了一個(gè)gRPC客戶(hù)端工廠(chǎng),用于在項(xiàng)目中創(chuàng)建gRPC客戶(hù)端實(shí)例。我們添加了兩種工廠(chǎng):Grpc.Net.ClientFactory和Grpc.AspNetCore.Server.ClientFactory。
該Grpc.Net.ClientFactory設(shè)計(jì)用于non-ASP.NET應(yīng)用模型的使用(如工人服務(wù))仍然使用Microsoft.Extensions.*原語(yǔ)不會(huì)對(duì)ASP.NET核心的依賴(lài)。
該Grpc.Net.ClientFactory設(shè)計(jì)用于仍使用Microsoft.Extensions.*基元(不依賴(lài)于ASP.NET核心)的非ASP.NET應(yīng)用程序模型(如Worker Services)。
在執(zhí)行服務(wù)到服務(wù)通信的應(yīng)用程序中,我們經(jīng)常發(fā)現(xiàn)大多數(shù)服務(wù)器也是使用其他服務(wù)的客戶(hù)端。在這些情況下,我們建議使用Grpc.AspNetCore.Server.ClientFactory它具有自動(dòng)傳播gRPC截止日期和取消令牌的功能。
要使用客戶(hù)端工廠(chǎng),請(qǐng)?jiān)趯⒁韵麓a添加到configureServices()之前,將適當(dāng)?shù)陌锰砑拥巾?xiàng)目(Grpc.AspNetCore.Server.Factory或Grpc.Net.ClientFactory)。
services.AddGrpcClient<GreeterClient>(options =>{options.BaseAddress = new Uri("https://localhost:5001");});gRPC攔截器
gRPC公開(kāi)了一種機(jī)制來(lái)攔截客戶(hù)端和服務(wù)器上的RPC調(diào)用。攔截器可以與現(xiàn)有的HTTP中間件結(jié)合使用。與HTTP中間件不同,攔截器允許您在序列化之前(在客戶(hù)端上)和反序列化之后(在服務(wù)器上)訪(fǎng)問(wèn)實(shí)際的請(qǐng)求/響應(yīng)對(duì)象,反之亦然。所有中間件都在請(qǐng)求端的攔截器之前運(yùn)行,反之亦然。
客戶(hù)端攔截器
與客戶(hù)端工廠(chǎng)一起使用時(shí),可以添加客戶(hù)端攔截器,如下所示。
services.AddGrpcClient<GreeterClient>(options =>{options.BaseAddress = new Uri("https://localhost:5001");}).AddInterceptor<CallbackInterceptor>();服務(wù)器攔截器
服務(wù)器攔截器可以ConfigureServices()如下所示進(jìn)行注冊(cè)。
services.AddGrpc(options =>{// This registers a global interceptoroptions.Interceptors.Add<MaxStreamingRequestTimeoutInterceptor>(TimeSpan.FromSeconds(30));}).AddServiceOptions<GreeterService>(options =>{// This registers an interceptor for the Greeter serviceoptions.Interceptors.Add<UnaryCachingInterceptor>();});有關(guān)如何編寫(xiě)攔截器的示例,請(qǐng)查看grpc-dotnet repo中的這些示例。
給予反饋
我們希望您喜歡ASP.NET Core和Blazor預(yù)覽版中的新功能!請(qǐng)通過(guò)在GitHub上提交問(wèn)題告訴我們您的想法。(再次聲明,本文大多內(nèi)容翻譯自:ASP.NET首席項(xiàng)目經(jīng)理Daniel Roth的介紹,因此才會(huì)有這段話(huà)。)
感謝您試用ASP.NET Core和Blazor!
原文地址:https://devblogs.microsoft.com/aspnet/asp-net-core-and-blazor-updates-in-net-core-3-0-preview-6/
轉(zhuǎn)載于:https://www.cnblogs.com/yilezhu/p/11031441.html
總結(jié)
以上是生活随笔為你收集整理的.NET Core 3.0 Preview 6中对ASP.NET Core和Blazor的更新的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 模拟layui弹出层
- 下一篇: DevExpress v19.1新版亮点