У нас есть требование предоставить возможности создания обложек для приложения ASP.NET MVC3.
Мой подход до сих пор заключался в том, чтобы решить эту проблему с помощью файлов cookie и дочерних действий для файлов CSS:
- Клиент ссылается на наше приложение, используя URL-адрес, например www.ourapp.com/as/www.clientapp.com/then-go-to/path/in/ourapp.
- Приведенный выше URL-адрес направляется методу действия, который записывает файл cookie с именем «skin» со значением «www.clientapp.com», а затем перенаправляет его в / path / in / ourapp.
- Наш макет (главная страница) содержит
@Html.Action
в разделе <head>
, где должны быть отрисованы CSS-файлы.
- Дочернее действие проверяет cookie и создает модель представления, которая сообщит частичному представлению, какие
<link>
теги будут отображаться.
Структура файла css основана на значении cookie. Таким образом, наш контент CSS может выглядеть так:
/content
/www.clientapp.com
/style1.css
/style1.css
/www.client2app.com
/style1.css
/style2.css
Я готов услышать лучшие образцы / альтернативы вышеупомянутым для применения скинов к макету. Однако это не причина для моего вопроса.
В настоящее время существует проблема с этим подходом, когда файлы css отсутствуют в файловой системе. Запрос заставляет IIS возвращать 404. Мы переопределяем страницу 404 пользовательской страницей (не используя тот же макет, который имеет действие @ Html.Action в <head>
). Это заставляет IIS выполнять некоторую дополнительную обработку, которая не требуется (например, частичные и дочерние действия для отображения ссылок входа / выхода, горизонтальной навигации и т. Д. На макете страницы 404).
На мой взгляд, есть 2 способа решить эту проблему:
- В дочернем действии, которое настраивает css, убедитесь, что файлы существуют на диске, прежде чем сообщать модели представления о том, что они должны быть отображены. Pro с таким подходом состоит в том, что это должно быть довольно легко Недостатки в том, что для его модульного тестирования придется обернуть файл ввода / вывода в сервис, который можно внедрить. Также приложение будет развернуто в Azure. Я думаю, что Azure может читать файловую систему (что и нужно), но не записывать в нее.
- Каким-то образом предотвратить возврат 404 для CSS-файлов. Чтобы сделать это, мы должны были бы реализовать логику в global.asax Application_Error? Или есть другой способ предотвратить запуск отсутствующих CSS-файлов при ответе 404?
Какой подход правильный? Или есть другой, который я не рассматриваю?
Обновление
Мы решили эту проблему на пользовательской странице ошибки 404 следующим образом:
[ActionName("not-found")]
public virtual ActionResult NotFound()
{
// do not return 404 for missing css files
if (Request.RawUrl.EndsWith(".css", StringComparison.OrdinalIgnoreCase))
{
Response.StatusCode = 404;
return new EmptyResult();
}
return View();
}