Как добавить заголовок в стиле интрасети (строка, возвращаемая из веб-обработчика) на каждую страницу в .NET Core - PullRequest
0 голосов
/ 23 мая 2019

В веб-приложении .NET Core я использую промежуточное программное обеспечение (app.UseMyMiddleware) для добавления заголовка интрасети к ответу. Ограничение заключается в том, что обработчик, который форматирует ответ (MyResponseHandler.FormatResponse), нельзя изменить, поскольку он используется в устаревших приложениях и возвращает строковое значение. У меня это работает как таковое, но я хочу ограничить обработку только запросами страниц, а не каждым проходящим запросом (например, css / js / images и т. Д.).

FormatResponse в основном просто принимает текущий ответ в виде строки, находит тег «body» и добавляет загрузку html, которая создает красивую строку меню для доступа ко всем другим приложениям.

Во-первых, это хороший способ реализовать общий заголовок в .NET Core? Все, что я нашел до сих пор, говорит только об использовании страницы макета, которая подходит для отдельного приложения, но не для большего числа приложений, написанных в разных средах.

Во-вторых, как мне отфильтровать ТОЛЬКО запросы страниц? Я могу отфильтровать все страницы, которые не содержат «.» но что произойдет, если есть «.» в строке запроса, например? Я также не уверен, есть ли когда-нибудь на страницах MVC или бритвы символ '.' в URL (не из того, что я видел до сих пор).

В-третьих, есть ли более эффективный способ сделать это? Просмотр всего этого кода для каждого отдельного запроса может немного замедлить работу. Можно ли отфильтровать ранее для сохранения выполнения кода или есть альтернативный способ?

Startup.cs

        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler(MiddlewareExtensions.GenericExceptionHandler);
                app.UseHsts();
            }

            app.UseHttpsRedirection();
            app.UseStaticFiles();
            app.UseMyMiddleware();

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

MiddlewareExtensions.cs

        public static void UseMyMiddleware(this IApplicationBuilder app)
        {
            app.UseMiddleware<LoadIntranetHeader>();
        }

LoadIntranetHeader.cs

    public class LoadIntranetHeader
    {
        private readonly RequestDelegate _next;

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

        public async Task Invoke(HttpContext context)
        {
            var originalBodyStream = context.Response.Body;
            var config = (IConfiguration)context.RequestServices.GetService(typeof(IConfiguration));

            using (var responseBody = new MemoryStream())
            {
                context.Response.Body = responseBody;

                await _next(context);

                context.Response.Body = originalBodyStream;

                responseBody.Seek(0, SeekOrigin.Begin);
                string response = new StreamReader(responseBody).ReadToEnd();

                if (!context.Request.Path.ToString().Contains(".") 
                    && !context.Request.Path.ToString().Contains("/api/", StringComparison.CurrentCultureIgnoreCase))
                {
                       response = MyResponseHandler.FormatResponse(config, response);
                }
                await context.Response.WriteAsync(response);
            }
        }
    }

...