Вставить ссылку на скрипт в HTML-файлы, используя промежуточное ПО ASP.NET Core - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь внедрить ссылку на скрипт во весь HTML, сгенерированный приложением ASP.NET Core, используя промежуточное ПО.Мой код вдохновлен этой записью в блоге и выглядит примерно так:

public class MyMiddleware
{
    private readonly RequestDelegate _next;

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

    public async Task Invoke(HttpContext context)
    {
        var newContent = string.Empty;
        var existingBody = context.Response.Body;

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

            try
            {
                await _next.Invoke(context);
            }
            finally
            {
                context.Response.Body = existingBody;
            }

            newBody.Seek(0, SeekOrigin.Begin);

            newContent = new StreamReader(newBody).ReadToEnd();

            if (context.Response.ContentType.StartsWith("text/html"))
            {
                newContent = newContent.Replace("</body", "<script src=\"my-reference-here\"></script></body");
            }

            await context.Response.WriteAsync(newContent);
        }
    }
}

Основная проблема здесь заключается в том, что промежуточное программное обеспечение запускается для всех запросов к серверу, включая CSS, javascripts,favicons и т. д. Мне бы хотелось, чтобы он работал только для вывода в формате HTML, поскольку приведенный выше код вызывает проблемы для некоторых типов файлов, и поскольку я не хочу писать все ответы дважды.

Любой способ сделать этов лучшую сторону?Я зарегистрировался на MapWhen, но, похоже, он не поддерживает просмотр содержимого ответа.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Я бы рекомендовал использовать разделы в ваших представлениях.Просто реализуйте это в вашем макете:

@RenderSection("BottomScripts", required: false)

И тогда в ваших представлениях вы можете использовать что-то вроде этого:

@section BottomScripts {
 @if (Model.NeedThisScript)
 {
  await Html.RenderPartialAsync("PartialWithYourScripts");
 }
}
0 голосов
/ 25 сентября 2018

Я бы лично порекомендовал вам , а не , чтобы реализовать это в качестве промежуточного программного обеспечения.Как вы можете видеть из своей собственной реализации, вы читаете весь ответ в память просто для того, чтобы иметь возможность заменить его.Это действительно неэффективно и мешает вам передавать ответ. BrowserLink делает это путем изменения потока, как это происходит , чтобы это было более эффективным.

Но вы должны рассмотреть возможность перемещения этой логики в MVC.Конечно, это предполагает, что вам не нужно изменять статическое содержимое файла.Но в MVC вы могли бы написать фильтр результатов , который будет выполняться только тогда, когда создается ViewResult (т.е. когда визуализируется представление MVC).И в этом фильтре вы можете затем изменить результат просмотра, чтобы установить некоторые параметры для внедрения этого скрипта.

А внутри MVC я бы просто добавил помощник по тегам или какой-то раздел в ваш макет, в котором вы могли бы затемвизуализировать ваш скрипт скриптТаким образом, вы будете иметь полный контроль над макетом и сможете легко интегрировать его с MVC.

При этом, чтобы избежать использования промежуточного программного обеспечения для несвязанных ответов, конечно, вы также можете просто переместить проверку Response.ContentType далее, так что вы фактически не читаете ответ в поток памяти для ответов, которые вам не нужно изменять.

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