中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

如何使用ASP.NETCore的中間件-創(chuàng)新互聯(lián)

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)如何使用ASP.NETCore的中間件,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名申請、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、裕安網(wǎng)站維護(hù)、網(wǎng)站推廣。

前言

我們知道,任何的一個web框架都是把http請求封裝成一個管道,每一次的請求都是經(jīng)過管道的一系列操作,最終到達(dá)我們寫的代碼中。那么中間件就是在應(yīng)用程序管道中的一個組件,用來攔截請求過程進(jìn)行一些其他處理和響應(yīng)。中間件可以有很多個,每一個中間件都可以對管道中的請求進(jìn)行攔截,它可以決定是否將請求轉(zhuǎn)移給下一個中間件。

asp.net core 提供了IApplicationBuilder接口來讓把中間件注冊到asp.net的管道請求當(dāng)中去,中間件是一個典型的AOP應(yīng)用。
每一個中間件都都可以在請求之前和之后進(jìn)行操作。請求處理完成之后傳遞給下一個請求。

中間件的運(yùn)行方式

默認(rèn)情況下,中間件的執(zhí)行順序根據(jù)Startup.cs文件中,在public void Configure(IApplicationBuilder app){}方法中注冊的先后順序執(zhí)行。


大概有3種方式可以在管道中注冊"中間件"


1.app.Use(),IApplicationBuilder接口原生提供,注冊等都用它。


2.app.Run() ,是一個擴(kuò)展方法,它需要一個RequestDelegate委托,里面包含了Http的上下文信息,沒有next參數(shù),因為它總是在管道最后一步執(zhí)行。


3.app.Map(),也是一個擴(kuò)展方法,類似于MVC的路由,用途一般是一些特殊請求路徑的處理。如:www.example.com/token 等。

上面的Run,Map內(nèi)部也是調(diào)用的Use,算是對IApplicationBuilder接口擴(kuò)充,如果你覺得名字都不夠準(zhǔn)確,那么下面這個擴(kuò)展方法就是正宗的注冊中間件的了,也是功能最強(qiáng)大的。

app.UseMiddleware<>(),沒錯,就是這個了。 為什么說功能強(qiáng)大呢?是因為它不但提供了注冊中間件的功能,還提供了依賴注入(DI)的功能,以后大部分情況就用它了。

中間件(Middleware)和過濾器(Filter)的區(qū)別

熟悉MVC框架的同學(xué)應(yīng)該知道,MVC也提供了5大過濾器供我們用來處理請求前后需要執(zhí)行的代碼。分別是AuthenticationFilter,AuthorizationFilter,ActionFilter,ExceptionFilter,ResultFilter。

根據(jù)描述,可以看出中間件和過濾器的功能類似,那么他們有什么區(qū)別?為什么又要搞一個中間件呢?
 其實,過濾器和中間件他們的關(guān)注點是不一樣的,也就是說職責(zé)不一樣,干的事情就不一樣。

舉個栗子,中間件像是埃辛諾斯戰(zhàn)刃,過濾器像是巨龍之怒,泰蕾茍薩的寄魂杖 ,你一個戰(zhàn)士拿著巨龍之怒,泰蕾茍薩的寄魂杖去戰(zhàn)場殺人,雖然都有傷害,但是你拿著法杖傷害低不說,還減屬性啊。

同作為兩個AOP利器,過濾器更貼合業(yè)務(wù),它關(guān)注于應(yīng)用程序本身,比如你看ActionFilter 和 ResultFilter,它都直接和你的Action,ActionResult交互了,是不是離你很近的感覺,那我有一些比如對我的輸出結(jié)果進(jìn)行格式化啦,對我的請求的ViewModel進(jìn)行數(shù)據(jù)驗證啦,肯定就是用Filter無疑了。它是MVC的一部分,它可以攔截到你Action上下文的一些信息,而中間件是沒有這個能力的。

什么情況我們需要中間件

那么,何時使用中間件呢?我的理解是在我們的應(yīng)用程序當(dāng)中和業(yè)務(wù)關(guān)系不大的一些需要在管道中做的事情可以使用,比如身份驗證,Session存儲,日志記錄等。其實我們的 asp.net core項目中本身已經(jīng)包含了很多個中間件。

舉例,我們在新建一個 asp.net core應(yīng)用程序的時候,默認(rèn)生成的模板當(dāng)中


public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
  app.UseDeveloperExceptionPage();
  
  app.UseStaticFiles();
  
  loggerFactory.AddConsole();
  
  app.UseMvc(routes =>
  {
    routes.MapRoute(
      name: "default",
      template: "{controller=Home}/{action=Index}/{id?}");
  });
}

懶得去下載源碼了,我們使用Reflector去查看源碼:


//擴(kuò)展方法`app.UseDeveloperExceptionPage();`
public static class DeveloperExceptionPageExtensions
{
  // Methods
  public static IApplicationBuilder UseDeveloperExceptionPage(this IApplicationBuilder app)
  {
    if (app == null)
    {
      throw new ArgumentNullException("app");
    }
    return UseMiddlewareExtensions.UseMiddleware<DeveloperExceptionPageMiddleware>(app, Array.Empty<object>());
  }
}


//擴(kuò)展方法`app.UseStaticFiles();`
public static class StaticFileExtensions
{
  // Methods
  public static IApplicationBuilder UseStaticFiles(this IApplicationBuilder app)
  {
    if (app == null)
    {
      throw new ArgumentNullException("app");
    }
    return UseMiddlewareExtensions.UseMiddleware<StaticFileMiddleware>(app, Array.Empty<object>());
  }
}

可以看到 app.UseDeveloperExceptionPage()app.UseStaticFiles()等等都是通過中間件實現(xiàn)的。

怎么樣自定義自己的中間件

背景:我們項目使用到中間件的情景是,需要和其他部門進(jìn)行用戶(User)信息的共享。 以平臺和子系統(tǒng)舉例,我們正在開發(fā)一個子系統(tǒng),其中用戶信息,登錄,注冊等功能是放在平臺上的,這是一個跨多語言的系統(tǒng),平臺是Java語言開發(fā),用戶在訪問子系統(tǒng)的一些頁面的時候需要驗證是否登錄,另外一些頁面是不需要驗證是否登錄的,所以需要一個身份驗證系統(tǒng)來代替Identity的功能。

幸運(yùn)的是微軟已經(jīng)給我們提供了一套身份驗證的中間件,在Microsoft.AspNetCore.Authentication命名空間下,我們只需要拓展,添加自己的功能就行了 。具體怎么做呢?直接看代碼吧。

根據(jù)約定俗成,中間件類需要有一個Invoke方法,簽名是public async Task Invoke(HttpContext context){},下面是一個中間件的示例類:


public class RequestLoggerMiddleware
{
  private readonly RequestDelegate _next;
  private readonly ILogger _logger;

  public RequestLoggerMiddleware(RequestDelegate next, ILoggerFactory loggerFactory)
  {
    _next = next;
    _logger = loggerFactory.CreateLogger<RequestLoggerMiddleware>();
  }

  public async Task Invoke(HttpContext context)
  {
    _logger.LogInformation("Handling request: " + context.Request.Path);
    await _next.Invoke(context);
    _logger.LogInformation("Finished handling request.");
  }
}

了解了上面的約定之后,我們就開始定義我們自己的中間件Class。

我們需要一個流程圖來理清邏輯思路,以便于寫代碼的時候思路更加的清晰。

如何使用ASP.NETCore的中間件

平臺有一個要求就是,用戶在我們子系統(tǒng)退出之后,要調(diào)用平臺的一個接口通知他們,他們要做一些后續(xù)的業(yè)務(wù)。

OK,開始擼碼。

  • 首先創(chuàng)建一個PlatformAuthoricationMiddleware,它繼承于Microsoft.AspNetCore.Authentication下的類AuthenticationMiddleware,由于AuthenticationMiddleware已經(jīng)實現(xiàn)了Invoke功能,所以我們只需要重寫(override)它里面的一些方法就可以了。等等,我們好像還需要一些配置,比如流程圖中的ReturnUrl,平臺的Cookie的Key值,平臺驗證用戶合法性的接口地址等參數(shù)。

  • 建立一個Options類進(jìn)行配置的設(shè)置,我們?nèi)∶譃椋?code>PlatformAuthenticationOptions,繼承AuthenticationOptions,并且實現(xiàn)掉IOptions<T>接口,這樣子就能在Startup中直接配置了。

  • 我們只需要重寫AuthenticationMiddleware中的CreateHandler方法就行了,在Handler中可以實現(xiàn)掉我們中間件的功能。

  • 然后創(chuàng)建一個處理的Handler類,取名為PlatformAuthenticationHandler,繼承于AuthenticationHandler<TOptions>用來處理請求中的調(diào)用。

至此,我們的核心需要的類已經(jīng)建立完了,剩下的就是填充代碼。


1.在PlatformAuthenticationHandler中重寫HandleAuthenticateAsync()方法 , 進(jìn)行主流程的控制。


2.在PlatformAuthenticationHandler中重寫FinishResponseAsync()方法,進(jìn)行Session的存儲操作。


3.在PlatformAuthenticationHandler中重寫HandleSignOutAsync()方法,進(jìn)行登出的控制,因為用戶登出之后我們要通知平臺做一些其他操作。


4.在PlatformAuthenticationHandler中重寫HandleUnauthorizedAsync()方法,進(jìn)行未認(rèn)證操作。

最后,我們需要一個擴(kuò)展類來把我們的中間件以擴(kuò)展方法注冊到管道當(dāng)中去 。


public static class MiddlewareExtensions
{
  public static IApplicationBuilder UsePlatformAuthentication(this IApplicationBuilder app) {
    if (app == null) {
      throw new ArgumentNullException(nameof(app));
    }

    return app.UseMiddleware<PlatformAuthenticationMiddleware>();
  }

  public static IApplicationBuilder UsePlatformAuthentication(this IApplicationBuilder app, CookieAuthenticationOptions options) {
    if (app == null) {
      throw new ArgumentNullException(nameof(app));
    }
    if (options == null) {
      throw new ArgumentNullException(nameof(options));
    }

    return app.UseMiddleware<PlatformAuthenticationMiddleware>(Options.Create(options));
  }
}

Startup中就是app.UsePlatformAuthentication()


public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) {
  loggerFactory.AddConsole(Configuration.GetSection("Logging"));

  //注冊PlatformAuthentication中間件
  app.UsePlatformAuthentication(new PlatformAuthenticationOptions() {
    UserSessionStore = new UserSessionStore(),
  });

  app.UseMvc();
}

上述就是小編為大家分享的如何使用ASP.NETCore的中間件了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

本文題目:如何使用ASP.NETCore的中間件-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://www.rwnh.cn/article44/csiche.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、網(wǎng)站維護(hù)、服務(wù)器托管營銷型網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
武夷山市| 城步| 苏尼特右旗| 怀来县| 台前县| 铜鼓县| 江华| 浦东新区| 夏邑县| 渭源县| 阜城县| 阳谷县| 赤峰市| 静海县| 南丹县| 赤水市| 德州市| 富蕴县| 海原县| 栾川县| 苏尼特右旗| 樟树市| 东平县| 久治县| 桐梓县| 花莲县| 张北县| 德保县| 鹤岗市| 鹤峰县| 大悟县| 犍为县| 沅江市| 莱西市| 桑植县| 芮城县| 北宁市| 天峨县| 白玉县| 资讯| 鹿邑县|