У меня есть HttpModule для анализа и мониторинга веб-сайтов. В этом HttpModule он использует фильтр ответов для изменения тела ответа и вставки фрагмента кода для загрузки кода JavaScript в текстовое / html-содержимое.

private string Filter_OnTransformString(string output)
{
    Logger.Info("Filter_OnTransformString", "Enter method for " + Request.RawUrl);

    if (Response.ContentType != "text/html")
    {
        Logger.Info("Filter_OnTransformString", "Exiting for " + Response.ContentType + " MIME type for " + Request.RawUrl);
        return output;
    }

    if (output != null)
    {
        var pos = output.IndexOf("</body>", StringComparison.InvariantCultureIgnoreCase);
        Logger.Verbose("Filter_OnTransformString", "pos (of closing </body>) == " + pos);

        if (pos > -1)
        {
            var left = output.Substring(0, pos);
            var right = output.Substring(pos);

            output = left + "<script type=\"text/javascript\" src=\"/heartbeat.axd/script\"></script>" + right;
        }
    }
    else
    {
        Logger.Warning("Filter_OnTransformString", "output == null for " + Request.RawUrl);
    }

    Logger.Info("Filter_OnTransformString", "Exit method for " + Request.RawUrl);

    return output;
}

Глядя на сетевой трафик в Chrome DevTools, я вижу, что bootstrap.css, jquery-ui.min.css, jquery-3.1.1.js и response.js не работают.

enter image description here

Тем не менее, другие файлы CSS и JS просто отлично работают. Например, вот вывод файла журнала для modernizr-2.8.3.js, за которым следует вывод файла журнала для jquery-3.1.1.js.

11:19:31.1695   Info    Filter_OnTransformString    Enter method for /Scripts/modernizr-2.8.3.js
11:19:31.1695   Info    Filter_OnTransformString    Exiting for application/javascript MIME type for /Scripts/modernizr-2.8.3.js


11:19:31.5914   Info    Filter_OnTransformString    Enter method for /Scripts/jquery-3.1.1.js
11:19:31.5914   Info    Filter_OnTransformString    Exiting for application/javascript MIME type for /Scripts/jquery-3.1.1.js

Есть ли что-то критическое, что я здесь упускаю?

Обновление:

На данный момент я закодировал проблему следующим образом:

if (!Request.RawUrl.EndsWithAny(new[] { ".css", ".js" }, StringComparison.InvariantCultureIgnoreCase))
{
    Logger.Verbose("Application_BeginRequest", "Attaching Response.Filter to " + Request.RawUrl);
    ResponseFilterStream filter = new ResponseFilterStream(Response.Filter);
    filter.TransformString += Filter_OnTransformString;
    Response.Filter = filter;
}
2
amber 22 Май 2019 в 19:12

2 ответа

Лучший ответ

Потратив больше времени на решение проблемы, я проверил журнал приложений на сервере. Я нашел виновника.

HttpModule выбрасывает необработанное исключение, и именно поэтому запрос просто не выполняется.

0
amber 27 Июн 2019 в 22:33

Ваш синтаксис неверен для set output var:

output = left + "<script type="text/javascript" src="/heartbeat.axd/script"></script>" + right;

Правильная форма объединения:

output = left + "<script type='text/javascript' src='/heartbeat.axd/script'></script>" + right;

Вероятно, это создаст исключение и не загрузит ваши статические файлы.

0
Jas 23 Май 2019 в 00:56