1. 程式人生 > >.NET Core 中間件

.NET Core 中間件

ret return response async 是否 rtu 16px 組件 生成

中間件是一種裝配到應用管道以處理請求和響應的軟件。 每個組件:

  1.選擇是否將請求傳遞到管道中的下一個組件。

  2.可在管道中的下一個組件前後執行工作。

請求委托用於生成請求管道。 請求委托處理每個 HTTP 請求。
使用 RunMap 和 Use 擴展方法來配置請求委托。 可將一個單獨的請求委托並行指定為匿名方法(稱為並行中間件),或在可重用的類中對其進行定義。 這些可重用的類和並行匿名方法即為中間件,也叫中間件組件。 請求管道中的每個中間件組件負責調用管道中的下一個組件,或使管道短路。

使用 IApplicationBuilder 創建中間件管道

ASP.NET Core 請求管道包含一系列請求委托,依次調用。 下圖演示了這一概念。 沿黑色箭頭執行。

技術分享圖片


每個委托均可在下一個委托前後執行操作。 此外,委托還可以決定不將請求傳遞給下一個委托,這就是對請求管道進行短路。 通常需要短路,因為這樣可以避免不必要的工作。 例如,靜態文件中間件可以返回靜態文件請求並使管道的其余部分短路。 先在管道中調用異常處理委托,以便它們可以捕獲在管道的後期階段所發生的異常。

新建一個類RequestIPMiddleware獲取ip地址

技術分享圖片
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;

public class RequestIPMiddleware { private readonly RequestDelegate _next; private readonly ILogger _logger; public RequestIPMiddleware(RequestDelegate next, ILoggerFactory loggerFactory) { _next = next; _logger = loggerFactory.CreateLogger<RequestIPMiddleware>(); }
public async Task Invoke(HttpContext context) { _logger.LogInformation("User IP------->" + context.Connection.RemoteIpAddress.ToString()); await context.Response.WriteAsync("IP----->"+context.Connection.RemoteIpAddress.ToString() +"\n"); await _next.Invoke(context); } }
View Code

創建類RequestIPExtensions

技術分享圖片
using Microsoft.AspNetCore.Builder;

public static class RequestIPExtensions
{
    public static IApplicationBuilder UseRequestIP(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<RequestIPMiddleware>();
    }
}
View Code

然後在Startup類中的Configure方法中調用

 loggerfactory.AddConsole(minLevel: LogLevel.Information);
 app.UseRequestIP(); //使用Ip中間件
 app.Run(async context =>{
       await context.Response.WriteAsync("Hello world !");
  });

參考 https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-2.1

.NET Core 中間件