Больше не может ПОЛУЧИТЬ после использования специального промежуточного программного обеспечения

Я вхожу в .NET Core, и у меня возникают проблемы с реализацией специального промежуточного программного обеспечения. У меня есть промежуточное ПО, которое должно проверять, есть ли в заголовках поле под названием «ключ пользователя». В противном случае возвращается 400 ОШИБКА. Если он есть, он должен дать мне запрошенный GET, но он просто дает мне ошибку 404. При удалении промежуточного программного обеспечения из моего startup.cs он снова работает, но тогда я не могу проверить, есть ли у него ключ или нет.

ApiKeyMiddleWare.cs

public class ApiKeyMiddleware
{
    private readonly RequestDelegate _next;

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

    public async Task Invoke(HttpContext context)
    {
        if (!context.Request.Headers.Keys.Contains("user-key"))
        {
            //Doesn't contain a key!
            context.Response.StatusCode = 400; //Bad request.
            await context.Response.WriteAsync("No API key found.");
            return;
        }
        else
        {
            //Contains key!
            //Check if key is valid here
            //if key isn't valid
            /*
            if(true == false)
            {

                context.Response.StatusCode = 401; //Unauthorized
                await context.Response.WriteAsync("Invalid API key found.");
                return;
            }
            */
        }

        await _next.Invoke(context);
    }
}

public static class ApiKeyMiddlewareExtension
{
    public static IApplicationBuilder ApplyApiKeyMiddleWare(this IApplicationBuilder app)
    {
        app.UseMiddleware<ApiKeyMiddleware>();
        return app;
    }
}

Startup.cs - метод настройки

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {


        app.MapWhen(context => context.Request.Path.StartsWithSegments("/api"), appBuilder =>
        {
            appBuilder.ApplyApiKeyMiddleWare();
        });

        if (env.IsDevelopment())
        {
            app.UseBrowserLink();
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        app.UseStaticFiles();


        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });


        //Swagger
        app.UseSwagger();
        app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
        });


    }

Сообщите мне, если вам понадобится что-то еще. Заранее спасибо!


person MistaJoe    schedule 01.03.2018    source источник


Ответы (1)


Ваше промежуточное ПО в порядке, но вам нужно зарегистрировать его, используя метод расширения UseWhen вместо MapWhen.

UseWhen: условно создает ветвь в конвейере запросов, которая повторно присоединяется к основному конвейеру.

MapWhen: Разветвляет конвейер запроса на основе результата данного предиката.

Другими словами, MapWhen прекращает выполнение остальной части конвейера, когда делегат возвращает значение true.

person Set    schedule 01.03.2018
comment
Да, это сработало. Я даже не знал об использовании UseWhen, спасибо! Я был очень сбит с толку. - person MistaJoe; 02.03.2018
comment
@MistaJoe круто, тогда примите этот ответ - person Set; 02.03.2018
comment
Принято, все еще новичок в SO, извините! - person MistaJoe; 02.03.2018