مشخصات مقاله
-
1288
-
0.0
-
3944
-
0
-
0
آموزش کار با ASP.NET MVC Core 2.0 Middleware
ASP.NET Core 2.0 Middleware
مشکل
ایجاد یک "Hello World" با استفاده از ASP.NET Core Middleware
راه حل
یک پروژه خالی ایجاد کنید و Configure() از کلاس Startup را مانند زیر تغییر دهید:
public void Configure(
IApplicationBuilder app,
IHostingEnvironment env)
{
// setup request pipeline using middleware
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World! (Run)");
});
}
این یک روش خوب برای استفاده از متد های پیشرفته در IApplicationBuilder برای ساختن pipeline است،
// RunMiddlewareExtensions.cs
public static void RunHelloWorld(this IApplicationBuilder app)
{
app.Run(async (context) =>
{
await context.Response.WriteAsync("Hello World! (Run)");
});
}
// Startup.cs
public void Configure(
IApplicationBuilder app,
IHostingEnvironment env)
{
// setup request pipeline using middleware
app.RunHelloWorld();
}
در قطعه کد قبلی ما IApplicationBuilder.Run() برای پیکربندی middleware استفاده کردیم، راه دیگر برای این کار() IApplicationBuilder.Use است،
// UseMiddlewareExtensions.cs
public static IApplicationBuilder UseHelloWorld(
this IApplicationBuilder app)
{
return app.Use(async (context, next) =>
{
await context.Response.WriteAsync("Hello World! (Use)\n");
await next();
});
}
// Startup.cs
public void Configure(
IApplicationBuilder app,
IHostingEnvironment env)
{
// setup request pipeline using middleware
app.UseHelloWorld();
app.RunHelloWorld();
}
این یک کار خوب است که اجزاء middleware را در یک کلاس جداگانه تعریف کنیم.
public class HelloWorldMiddleware
{
private readonly RequestDelegate next;
public HelloWorldMiddleware(RequestDelegate next)
{
this.next = next;
}
public async Task Invoke(HttpContext context)
{
await context.Response.WriteAsync("Hello World! (Use in Class)\n");
await this.next(context);
}
}
// UseMiddlewareExtensions.cs
public static IApplicationBuilder UseHelloWorldInClass(
this IApplicationBuilder app)
{
return app.UseMiddleware< HelloWorldMiddleware >();
}
// Startup.cs
public void Configure(
IApplicationBuilder app,
IHostingEnvironment env)
{
// setup request pipeline using middleware
app.UseHelloWorld();
app.UseHelloWorldInClass();
app.RunHelloWorld();
}
مباحثه
Middleware یک component است که پیام های HTTP requestو response messages رامتوقف می کند. ما یک زنجیره از این components ایجاد می کنیم تا یک pipeline برای درخواست ما ایجاد می کنیم.
ما این pipeline را در متد Configure() از طریق پارامتر IApplicationBuilder خود راه اندازی می کنیم که برای این منظور دارای متد های زیر است.
- Run() : middleware را اضافه می کند و pipeline را متوقف می کند، یعنی middleware بعدی را فرانمی خواند.
- Use() : middleware را به عنوان یک lambda یا کلاس اختصاصی اضافه می کند.
- Map() : middleware را بر اساس مسیر درخواست شده اضافه می کند.
Run
RequestDelegate به عنوان یک پارامتر delegate گرفته می شود ، که وقتی فرخوانده می شود به عنوان پارامتر HttpContext گرفته می شود.
Use
Func را به عنوان یک پارامتر می گیرد،که HttpContext می گیرد و اشاره گر به middleware بعدی و هیچ چیز را برمی گرداند. (Task). اگر middleware بعدی نامعلوم نباشد، این در خواست pipeline (همانند Run) را کوتاه می کند.
UseMiddleware
هنگام تنظیم middleware به عنوان یک کلاس، ما از UseMiddleware برای اتصال آن استفاده می کنیم ، کلاس ما را به عنوان یک generic parameter ارائه می کنیم.
کلاس اختصاصی middleware دارای دو قطعه مهم است:
- Constructor در واقع RequestDelegate قبول می کند. این درخواست برای ارسال درخواست به middleware بعدی فراخوانی خواهد شد.
- این یک متد Invokeaccepting HttpContext که یک Task برمی گرداند. این در هنگام فراخوانی middleware توسط framework نامیده می شود.
پیاده سازی middleware در یک کلاس اختصاصی و سیم کشی کردن(wiring up) با استفاده از UseMiddleware بهترین / پاک ترین روش است.
Extension Methods
توجه داشته باشید به تفاوتی که در متد های extension ، RunXXX یک value بر نمی گرداند، با این حال، UseXXX بر می گرداند (IApplicationBuilder).این به این دلیل است که Run() (short-circuits) the pipeline) به پایان می رسد در حالی که Use() با middleware دیگر زنجیر شده.
Order
Middleware components به ترتیب آنها در متد Configure () ظاهر می شوند، مگر اینکه منظور آنها در pipeline اضافه شده است. response ، در مسیر بازگشت به مشتری، از طریق همان middleware pipeline نیز عبور می کند.