Metrika

7 февраля 2013 г.

IIS: проблемы с генерацией статического контента в ASP.NET

Если мне нужно сгенерировать на сайте 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.