.net core 2.0 API игнорирует промежуточное ПО для неверной маршрутизации - PullRequest
0 голосов
/ 09 января 2019

У меня есть некоторое промежуточное ПО для проверки, которое возвращает определенный ответ, если некоторые данные отсутствуют.

Когда я звоню с недопустимым URL-адресом, промежуточное программное обеспечение выполняется, и в ответе отправляется сообщение об ошибке, но ошибка указывает на проблему проверки, а не на то, что URL-адрес недействителен.

Итак, мой вопрос: как настроить метод настройки так, чтобы любой недопустимый URL-адрес не выполнял промежуточное программное обеспечение и явно возвращал ошибку 404.

Вот мой метод настройки:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)//, ITimingLogger timingLogger
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        //app.Use(async (HttpContext context, Func<Task> next) =>
        //{
        //    var timer = new Stopwatch();
        //    timer.Start();
        //    await next();
        //    timer.Stop();
        //    timingLogger.LogElapsedTime(context.Request.Method, context.Request.Path, timer.ElapsedMilliseconds);
        //});

        app.UseStaticFiles();
        app.UseCookiePolicy();

        app.UseMiddleware<RequestResponseLoggingMiddleware>();
        app.UseMiddleware<UnhandledExceptionHandlerMiddleware>();
        app.UseMiddleware<SubscriptionIdValidatorMiddleware>();

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

Спасибо

1 Ответ

0 голосов
/ 09 января 2019

Простой регистратор запросов

Попробуйте вместо этого ...

app.Use(async (HttpContext context, Func<Task> next) =>
{
    if (context== null) throw new ArgumentNullException(nameof(context));

    var sw = Stopwatch.StartNew();
    try
    {
        await next(context);
        sw.Stop();

        // do your logging work here

        // for example
        if (httpContext.Response?.StatusCode > 499)
        {
            // 500+ error code is a server error
            // log the error
        }

    }
    catch (Exception ex) when (LogException(context, sw, ex))
    {
        // never caught, because `LogException()` returns false.         
    }
}

и затем добавьте этот статический метод

static bool LogException(HttpContext context, Stopwatch sw, Exception ex)
{
    sw.Stop();

    // log the exception

    return false;
}

конвейер запросов

Чтобы ответить на ваш вопрос более прямо, а не просто дать вам блок кода. Я считаю, что вы неправильно понимаете, как ведет себя конвейер запросов. Я постараюсь объяснить это с помощью вашего кода.

app.Use(async (HttpContext context, Func<Task> next) =>
{
    // every single request is currently hitting this middleware
    // even regardless if the URI "exists" or not.
    // to solve this you need to define what is a valid URI

    // for example, validate the path
    if (context.Request.Path != "foo")
    {
        return next();  // break out
    }

    // if we got this far, that means it was a valid URI
    var timer = new Stopwatch();
    timer.Start();

    await next();

    timer.Stop();
    // do work
});

Надеюсь, это иллюстрирует, как работает конвейер.

Конвейер запросов выполняется в указанном вами порядке. На данный момент в вашем текущем коде нет ничего, что определяло бы что такое "действительный" URI .


...