Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

IApplicationBuilder.Use() และ IApplicationBuilder.Run() C# Asp.net Core แตกต่างกันอย่างไร


เราสามารถกำหนดค่ามิดเดิลแวร์ในวิธี Configure ของคลาส Startup โดยใช้อินสแตนซ์ IapplicationBuilder

Run() เป็นวิธีการขยายบนอินสแตนซ์ IApplicationBuilder ซึ่งเพิ่มเทอร์มินัลมิดเดิลแวร์ไปยังไปป์ไลน์คำขอของแอปพลิเคชัน

เมธอด Run เป็นวิธีการขยายบน IApplicationBuilder และยอมรับพารามิเตอร์ของ RequestDelegate

ลายเซ็นของวิธีการเรียกใช้

public static void Run(this IApplicationBuilder app, RequestDelegate handler)

ลายเซ็นของ RequestDelegate

public delegate Task RequestDelegate(HttpContext context);

ตัวอย่าง

public class Startup{
   public Startup(){
   }
   public void Configure(IApplicationBuilder app, IHostingEnvironment env,
   ILoggerFactory loggerFactory){
      //configure middleware using IApplicationBuilder here..
      app.Run(async (context) =>{
         await context.Response.WriteAsync("Hello World!");
      });
      // other code removed for clarity..
   }
}

ฟังก์ชัน MyMiddleware ด้านบนไม่ใช่แบบอะซิงโครนัส ดังนั้นจะบล็อกเธรดจนกว่าจะเสร็จสิ้นการดำเนินการ ดังนั้น ทำให้เป็นแบบอะซิงโครนัสโดยใช้ async andawait เพื่อปรับปรุงประสิทธิภาพและความสามารถในการปรับขนาด

public class Startup{
   public Startup(){
   }
   public void Configure(IApplicationBuilder app, IHostingEnvironment env){
      app.Run(MyMiddleware);
   }
   private async Task MyMiddleware(HttpContext context){
      await context.Response.WriteAsync("Hello World! ");
   }
}

กำหนดค่ามิดเดิลแวร์หลายตัวโดยใช้ Run()

ข้อมูลต่อไปนี้จะรันเมธอด Run แรกเสมอ และจะไม่มีวันไปถึงเมธอด Run ที่สอง

public void Configure(IApplicationBuilder app, IHostingEnvironment env){
   app.Run(async (context) =>{
      await context.Response.WriteAsync("1st Middleware");
   });
   // the following will never be executed
   app.Run(async (context) =>{
      await context.Response.WriteAsync(" 2nd Middleware");
   });
}

ใช้

หากต้องการกำหนดค่ามิดเดิลแวร์หลายตัว ให้ใช้วิธีการขยาย Use() มันคล้ายกับวิธีการ Run() ยกเว้นว่ามันรวมพารามิเตอร์ถัดไปเพื่อเรียกใช้มิดเดิลแวร์ตัวถัดไปในลำดับเหล่านี้

public void Configure(IApplicationBuilder app, IHostingEnvironment env){
   app.Use(async (context, next) =>{
      await context.Response.WriteAsync("1st Middleware!");
      await next();
   });
   app.Run(async (context) =>{
      await context.Response.WriteAsync("2nd Middleware");
   });
}