Если мне нужно сгенерировать на сайте ASP.NET статический контент (например JavaScript-файл), то я делаю это через Global.asax в обработчике события Application_BeginRequest:
void Application_BeginRequest(object sender, EventArgs e)
{
string req = HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath.ToLower();
// Перенаправление обращений к JavaScript файлам на их динамическое формирование
if (req.CompareTo("~/scripts/item_types.js")==0)
{
Context.RewritePath("~/js_item_types.aspx");
return;
}
}
Файл js_item_types.aspx в ответ выдает необходимый контент, например после обращения к БД.
Все отлично работает, когда я запускаю проект на локальной машине под управлением встроенного в VS Web-сервера, но перестает работать, когда я развертываю проект на IIS сервере. При обращении к файлу /scripts/item_types.js возникает ошибка 404.
Проблема в том, что для IIS файлы *.js это статический контент и он проверяет их наличие или отсутствие еще до того, как передаст управление в ASP.NET.
Что бы так не происходило, надо указать IIS, что этот файл обрабатывается в ASP.NET. Для этого в панели управления IIS выбираем сайт, далее тыкаем в иконку Handler Mappings, откроется список и в него надо добавить новый хендлер. Справа нажимаем Add Managed Handler в появившемся окне заполняем поля: Request path -> *item_types.js, Type -> ASP.global_asax, Name -> JS_item_types и давим OK.