Где должно находиться промежуточное ПО статических файлов в конвейере ASP.NET Core? - PullRequest
0 голосов
/ 06 июля 2018

Я использую ASP.NET Core 2.1.Я думал, что промежуточное ПО статических файлов должно предшествовать промежуточному ПО mvc - нет необходимости запускать запрос через mvc, например, просто для обслуживания файла css.

Так что они у меня в следующем порядке:

app.UseExceptionHandler(/*...*/)
app.UseHsts();
app.UseHttpsRedirection();
app.UseStatusCodePagesWithReExecute(/*...*/);
// and lastly:
app.UseStaticFiles();
app.UseMvc(/*...*/);

Однако, когда я включаю ведение журнала уровня отладки, я замечаю, что если статический файл отсутствует, он проходит через Microsoft.AspNetCore.Builder.RouterMiddleware и говорит Request did not match any routes, затем запускает мой ErrorController и выдает 404 для этого запроса.

Итак:

  • это правильный порядок для конвейера?
  • Есть ли способ избежать всего этого, или это задумано?Например, какой-нибудь «более легкий» процесс запуска 404 без прохождения всего этого?Как, может быть, иметь промежуточное ПО для статических файлов первым (не уверен, что это разумно / безопасно)?

Ответы [ 2 ]

0 голосов
/ 23 июля 2018

это правильный порядок для конвейера?

Да, это так.

Однако, когда я включаю ведение журнала уровня отладки, я замечаю, что если статический файл отсутствует, он проходит через Microsoft.AspNetCore.Builder.RouterMiddleware и говорит Request did not match any routes, затем запускает мой ErrorController и выдает 404 для этого запроса. Почему?

Во-первых, ваш отсутствующий статический запрос файла проходит через обработчик исключений, HSTS, перенаправление HTTPS и промежуточное ПО StatusCodePagesWithReExecute, но давайте их проигнорируем, потому что ничего интересного нет. Запрос просто проходит через них.

Затем он обрабатывается промежуточным ПО статических файлов. Промежуточное ПО вскоре понимает, что этот файл отсутствует, и просто позволяет вашему запросу выполнить следующее промежуточное ПО , которое является промежуточным ПО MVC.

Промежуточное программное обеспечение MVC просматривает таблицу маршрутов и находит маршрут "catchAll" и позволяет ErrorController обрабатывать запрос. Именно поэтому пропущенные файлы обрабатываются ErrorController.

P.S. Я полагаю, у вас есть маршрут "catchAll" примерно так:

app.UseMvc(routes =>
        {
            .... // your routes here

            routes.MapRoute("catchAll", "{*.}", new { controller = "Error", action = "Error404" }
        });
0 голосов
/ 12 июля 2018

Чтобы сделать его легче, у вас может быть специальное промежуточное программное обеспечение, похожее на это:

var avoidFolders = new string[] { "js", "css" };

app.Use(async (context, next) => {
    if (avoidFolders.Contains(context.Request.Path.Value.Trim('/')))
        context.Response.StatusCode = 404;
    else await next();
});

Несмотря на то, что вам придется включать все статические папки в массиве, оно обязательно возвращает 404, не переходя кмаршрутизации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...