У меня есть 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 не работают.
Тем не менее, другие файлы 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;
}