Sepertinya ini harus menjadi pertanyaan langsung, tetapi saya tidak dapat menemukan solusi melalui Google.

Tampaknya cukup standar bahwa di ASP.NET Core, pelaksana IHttpHandler digantikan oleh kelas middleware. Salah satu kelebihan sistem lama adalah Anda dapat mengatur penangan HTTP untuk merespons rute, yang ditentukan di web.config.

Jadi, misalnya, jika pelaksana IHttpHandler saya bernama FooHandler, web.config akan berisi sesuatu seperti:

<location path="foo">
    <system.webServer>
        <handlers>
            <add name="FooHandler" path="*" verb="*" type="FooCompany.FooProduct.FooHandler, FooCompany.FooProduct"/>
        </handlers>
    </system.webServer>
</location>

Apakah ada pengganti satu-ke-satu untuk perutean seperti ini di ASP.NET Core? Bagaimana cara melakukannya?

Edit: Kelas middleware baru mungkin terlihat seperti:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using System.Threading.Tasks;

namespace FooCompany.FooProduct.Middleware
{
    public class FooMiddleware
    {
        private readonly RequestDelegate _next;

        public FooMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            context.Response.StatusCode = 200;
            await context.Response.WriteAsync("OK");

            await _next.Invoke(context);
        }
    }

    public static class FooMiddlewareExtensions
    {
        public static IApplicationBuilder UseFoo(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<FooMiddleware>();
        }
    }
}
1
Brian Gradin 15 Desember 2017, 02:28

1 menjawab

Jawaban Terbaik

Anda dapat menggunakan metode ekstensi Peta dari IApplicationBuilder seperti itu:

public static class FooMiddlewareExtensions
{
    public static IApplicationBuilder UseFoo(this IApplicationBuilder builder, string path)
    {
        return builder.Map(path, b => b.UseMiddleware<FooMiddleware>());
    }
}

Anda juga dapat melakukannya di dalam Middleware Anda

public class FooMiddleware
{
    private readonly RequestDelegate _next;
    private readonly PathString _path;

    public FooMiddleware(RequestDelegate next, PathString path)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        if (!context.Request.Path.StartsWithSegments(path))
        {
            // jump to the next middleware
            await _next.Invoke(context);
        }

        // do your stuff
    }
}
4
Kalten 13 Maret 2019, 22:17