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

การใช้งาน Map Extension ในการเพิ่ม Middleware ไปยัง Pipeline ของ C# ASP.NET Core

Middleware เป็นคอมโพเนนต์ซอฟต์แวร์ที่ประกอบรวมกันเป็น Pipeline ของแอปพลิเคชันเพื่อจัดการ Request และ Response แต่ละคอมโพเนนต์จะเลือกว่าจะส่ง Request ต่อไปยังคอมโพเนนต์ถัดไปใน Pipeline หรือไม่ และสามารถทำงานบางอย่างก่อนและหลังจากที่คอมโพเนนต์ถัดไปถูกเรียกใน Pipeline

Map Extensions ใช้เป็นข้อตกลงสำหรับการแยกสาขา (Branching) ของ Pipeline

Map Extension Method

เมธอด Map ใช้สำหรับจับคู่ Request Delegates ตาม Path ของ Request Map เพียงรับ Path และฟังก์ชันที่กำหนดค่า Middleware Pipeline แยกต่างหาก

ตัวอย่างพื้นฐาน

private static void HandleMapTest(IApplicationBuilder app) {
    app.Run(async context => {
        await context.Response.WriteAsync("Map Test Successful");
    });
}

public void ConfigureMapping(IApplicationBuilder app) {
    app.Map("/maptest", HandleMapTest);
}

ในตัวอย่างข้างต้น คำขอใดๆ ที่มี Base Path เป็น /maptest จะถูกจัดการโดย Pipeline ที่กำหนดค่าในเมธอด HandleMapTest

MapWhen - Predicate-based Branching

นอกจาก Path-based Mapping แล้ว เมธอด MapWhen รองรับ Predicate-based Middleware Branching อนุญาตให้สร้าง Pipeline แยกได้อย่างยืดหยุ่น

Predicate ใดๆ ประเภท Func<HttpContext, bool> สามารถใช้เพื่อแมป Request ไปยังสาขาใหม่ของ Pipeline

private static void HandleBranch(IApplicationBuilder app) {
    app.Run(async context => {
        await context.Response.WriteAsync("Branch used.");
    });
}

public void ConfigureMapWhen(IApplicationBuilder app) {
    app.MapWhen(context => {
        return context.Request.Query.ContainsKey("branch");
    }, HandleBranch);
    
    app.Run(async context => {
        await context.Response.WriteAsync("Hello from main pipeline");
    });
}

ในตัวอย่างนี้ หาก Query String มี key "branch" จะเข้าสู่ Branch Pipeline มิฉะนั้นจะไปที่ Main Pipeline

Nested Maps (Map ต่อยอด)

Maps สามารถซ้อนกันได้ (Nested)

app.Map("/level1", level1App => {
    level1App.Map("/level2a", level2AApp => {
        // "/level1/level2a"
        // ...
    });
    level1App.Map("/level2b", level2BApp => {
        // "/level1/level2b"
        // ...
    });
});

MapWhen กับเงื่อนไขหลายเงื่อนไข

app.MapWhen(context => context.Request.Path.StartsWithSegments("/api"), apiApp => {
    apiApp.UseAuthentication();
    apiApp.UseAuthorization();
    apiApp.Run(async context => {
        await context.Response.WriteAsync("API Pipeline");
    });
});

app.MapWhen(context => context.Request.Path.StartsWithSegments("/admin"), adminApp => {
    adminApp.UseMiddleware();
    adminApp.Run(async context => {
        await context.Response.WriteAsync("Admin Pipeline");
    });
});