Asp.Net Core 2.x بنية وسيطة

8

واجهت عدة طرق لكتابة برنامج وسيط بسيط مباشرة في طريقة Startup.Configure ():

// Syntax 1.
app.Use((context, next) =>
{
    context.Response.Headers.Add("X-Content-Type-Options", "nosniff");
    return next();
});

// Syntax 2.
app.Use(async (context, next) =>
{
    context.Response.Headers.Add("X-Content-Type-Options", "nosniff");
    await next();
});

// Syntax 3.
app.Use(async (context, next) =>
{
    context.Response.Headers.Add("X-Content-Type-Options", "nosniff");
    await next.Invoke();
});

// Syntax 4.
app.Use(next =>
{
    return ctx =>
    {
        ctx.Response.Headers.Add("X-Content-Type-Options", "nosniff");
        return next(ctx);
    };
});

هم جميعا نفس الشيء؟

2 الاجابة

4
افضل جواب

يستخدم بناء الجملة 4 Use طريقة IApplicationBuilder

IApplicationBuilder Use(Func<RequestDelegate, RequestDelegate> middleware)

يستخدم بناء الجملة 1 و 2 و 3 طريقة تمديد لـ IApplicationBuilder وهو مجمع للطريقة السابقة في بناء الجملة 4. وإليك التفسير

public static IApplicationBuilder Use(this IApplicationBuilder app, Func<HttpContext, Func<Task>, Task> middleware)
{
    return app.Use(next =>
    {
        return context =>
        {
            Func<Task> simpleNext = () => next(context);
            return middleware(context, simpleNext);
        };
    });
}

بالنسبة للبناء 2 و 3 ، لا يوجد فرق بين next.Invoke() و next() . كلاهما يترجم إلى نفس الطريقة.

:مؤلف
2
افضل جواب

بناء الجملة 1 و 2 بناء الجملة تختلف وظيفياً. بناء الجملة 1 لا ينتظر next() لإنهاء Task . يقوم بناء الجملة 1 بتمرير وظيفة لامدا عادية إلى Use ويعود Task دون انتظار اكتمالها. بناء الجملة 2 يمر async وظيفة لامدا و awaiting ال Task قبل العودة. ال await الكلمة الرئيسية تخبر التطبيق بإيقاف التنفيذ مؤقتًا حتى next() المهمة كاملة. في الكود من مثالك ، قد لا يؤدي ذلك إلى اختلاف وظيفي ، ولكن هناك أوقات تنتظر فيها Task لإكمال يمكن أن تحدث فرقا.

بناء الجملة 2 و 3 بناء الجملة مختلفة من الناحية اللغوية ومتطابقة وظيفياً. بناء الجملة 2 هو مجرد إصدارات سهلة الاستخدام من بناء الجملة 3. راجع Func <T> () مقابل Func <T> .Invoke ()

بناء الجملة 1 و 4 بناء الجملة مختلفة من الناحية اللغوية ومتطابقة وظيفياً. بناء الجملة 1 مجرد غلاف سهل الاستخدام حول بناء الجملة 4. راجع UseExtension.cs

// syntax 1,2,3 use this 
public static IApplicationBuilder Use(
    this IApplicationBuilder app, 
    Func<HttpContext, Func<Task>, Task> middleware)
{
    // which calls into syntax4
    return app.Use(next =>
    {
        return context =>
        {
            Func<Task> simpleNext = () => next(context);
            return middleware(context, simpleNext);
        };
    });
}
:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام