詳解在ASP.NET Core中如何編寫合格的中間件

 更新時間:2020-01-15 16:00:37   作者:佚名   我要評論(0)

這篇文章探討了讓不同的請求去使用不同的中間件,那么我們應該如何配置ASP.NET Core中間件?其實中間件只是在ASP.NET Core中處理Web請求的管道。所有ASP.NET Core應

這篇文章探討了讓不同的請求去使用不同的中間件,那么我們應該如何配置ASP.NET Core中間件?其實中間件只是在ASP.NET Core中處理Web請求的管道。所有ASP.NET Core應用程序至少需要一個中間件來響應請求,并且您的應用程序實際上只是中間件的集合。當然MVC管道本身就是中間件,早在WebForm時代就出現過HttpModules、HttpHandler、那個時候悠然記得我通過它們來組織我的廣告系統,不閑扯我們繼續。

每個中間件組件都有一個帶有HttpContext參數的Invoke方法。您可以使用這個參數來處理方法。

public async Task Invoke(HttpContext context)
{
 if (context.Request.Path...)
 {
  await context.Response.WriteAsync("writing text...");
 }
}

應用程序中最頂層的中間件將始終針對每個請求被調用。這是由.NET框架自動完成的。中間件可以向客戶端發送響應,也可以調用下一個中間件。對于后一種選擇,它當然需要訪問下一個中間件組件。這就是為什么大多數中間件組件都是使用帶有RequestDelegate參數的構造函數定義的。總之,RequestDelegate會自動填充,您無需在意。

中間件在Startup.cs的Configure方法中注冊。Configure方法具有IApplicationBuilder參數,該參數提供了所有類型的中間件注冊所需的方法,我們試著去編寫一個中間件。

public class MyCustomMiddleware
 {
  private readonly RequestDelegate _next;
  public MyCustomMiddleware(RequestDelegate next)
  {
   _next = next;
  }
  public async Task Invoke(HttpContext context, IWebHostEnvironment env)
  {
   context.Response.Headers["app-name"] = env.ApplicationName+"Zaranet";
   context.Response.Headers["env-name"] = env.EnvironmentName+ "Zaranet";
   await _next(context);
  }
 }

隨后我們在Startup.cs的Configure方法中通過 use 來注冊自定義中間件。

public void Configure(IApplicationBuilder app, ...)
{
 app.UseMyCustomMiddleware();
}

啟動程序我們發現一些正常,我們得到了我們想要的效果。

 

但實際上,您很少需要直接調用UseMiddleware,因為中間件作者的標準方法是編寫特定于所注冊中間件的擴展方法:

using MiddlerWareSolucation.MiddlerWare;
using Microsoft.AspNetCore.Builder;

namespace MiddlerWareSolucation.MiddlerWare_Extensions
{
 public static class MyCustomMiddlewareExtensions
 {
  public static IApplicationBuilder UseMyCustomMiddleware(this IApplicationBuilder app)
  {
   app.UseMiddleware<MyCustomMiddleware>();

   return app;
  }
 }
}

隨后直接調用Extensions擴展方法,效果還是一樣的。

public void Configure(IApplicationBuilder app, ...)
{
 app.UseMyCustomMiddleware();
}

部分時候我們想要通過客戶端請求的路徑來對我們的中間件進行啟動,當然 MapWhen 允許您通過指定謂詞將中間件管道分成兩個完全獨立的分支:

app.UseMiddlewareOne();

app.MapWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>
{
  appBuilder.UseMiddlewareTwo();
});

app.UseMiddlewareThree();

在此示例中,中間件One將始終執行,如果請求路徑以“ / api”開頭,則將執行中間件Two。否則,將執行中間件Three。使用這種配置,中間件2和中間件3都無法針對單個請求執行。

我想說的是最后一種情況是,您希望大多數中間件針對所有請求運行,但是您有一些條件件-特定中間件僅應針對某些請求運行。

這可以通過UseWhen輕松實現,UseWhen還使用謂詞來確定中間件是否應該運行:

app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>
{
 appBuilder.UseStatusCodePagesWithReExecute("/apierror/{0}");

 appBuilder.UseExceptionHandler("/apierror/500");
});

這樣就可以通過選擇注冊方式來自己控制中間件。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

  • 詳解在ASP.NET Core 中使用Cookie中間件
  • 詳解ASP.NET Core 中間件之壓縮、緩存
  • 淺談ASP.NET Core 中間件詳解及項目實戰
  • Asp.Net Core 通過中間件防止圖片盜鏈的實例
  • ASP.NET Core 2.0 帶初始參數的中間件問題及解決方法
  • 淺談ASP.NET Core 2.0 中間件(譯)

相關文章

  • 詳解在ASP.NET Core中如何編寫合格的中間件

    詳解在ASP.NET Core中如何編寫合格的中間件

    這篇文章探討了讓不同的請求去使用不同的中間件,那么我們應該如何配置ASP.NET Core中間件?其實中間件只是在ASP.NET Core中處理Web請求的管道。所有ASP.NET Core應
    2020-01-15
  • .NET 開發環境搭建圖文詳解

    .NET 開發環境搭建圖文詳解

    1 概述 在接下來的時間里,將會入手ASP.NET MVC這一專題,盡量用最快的時間,最有效的方法,分別從深度和廣度上剖析這一專題,力求講明白、講透。以此來與大家分享,
    2020-01-15
  • .NET Core 實現微信小程序支付功能(統一下單)

    .NET Core 實現微信小程序支付功能(統一下單)

    最近公司研發了幾個電商小程序,還有一個核心的電商直播,只要是電商一般都會涉及到交易信息,離不開支付系統,這里我們統一實現小程序的支付流程(與服務號實現步驟
    2020-01-15
  • 利用.net core實現反向代理中間件的方法

    利用.net core實現反向代理中間件的方法

    最近在將一些項目的rest api遷移到.net core中,最開始是用的Nginx做反向代理,將已經完成切換的部分切入系統,如下圖所示: 由于遷移過程中也在進行代碼重構,需要
    2020-01-15
  • ASP.NET MVC實現依賴注入的完整過程

    ASP.NET MVC實現依賴注入的完整過程

    前言 在java的spring中有自動注入功能,使得代碼變得更加簡潔靈活,所以想把這個功能移植到c#中,接下來逐步分析實現過程 1.使用自動注入場景分析 在asp.net mvc中,
    2020-01-15
  • .NET資源泄露與處理方案知識點分享

    .NET資源泄露與處理方案知識點分享

    .NET雖然擁有強大易用的垃圾回收機制,但并不是因為這樣,你就可以對資源管理放任不管,其實在稍不注意的時候,可能就造成了資源泄露,甚至因此導致系統崩潰,到那時
    2020-01-15
  • asp.net大文件上傳解決方案實例代碼

    asp.net大文件上傳解決方案實例代碼

    以ASP.NET Core WebAPI 作后端 API ,用 Vue 構建前端頁面,用 Axios 從前端訪問后端 API ,包括文件的上傳和下載。 準備文件上傳的API #region 文件上傳 可以帶參
    2020-01-15
  • .Net Core讀取Json配置文件的實現示例

    .Net Core讀取Json配置文件的實現示例

    前言:在與傳統的asp.net MVC項目相比,.net core項目在項目目錄的文件結構上和功能上與前者都有很大的區別。例如:在.net core中使用Startup.cs取代Global.asax文件
    2020-01-15
  • .net core部署到windows服務上的完整步驟

    .net core部署到windows服務上的完整步驟

    前言 Net core 項目部門在Windows有很多種方式,大致有以下幾種, dotnet 命令, iis(windowshosts), 一些開源的應用容器(docker ) 基于一些exe 程
    2020-01-15
  • .NET Core 微信小程序退款步驟——(統一退款)

    .NET Core 微信小程序退款步驟——(統一退款)

    繼上一篇".NET Core 微信小程序支付——(統一下單)后",本文將實現統一退款功能,能支付就應該能退款嘛,一般涉及到錢的東西都會比較敏感,所以在設計退款流程時一
    2020-01-15

最新評論

老快3投注技巧