.NET MVC3: Предотвратить 404 для отсутствующих файлов CSS? Или убедитесь, что файлы существуют до написания HTML? - PullRequest
2 голосов
/ 09 января 2012

У нас есть требование предоставить возможности создания обложек для приложения ASP.NET MVC3.

Мой подход до сих пор заключался в том, чтобы решить эту проблему с помощью файлов cookie и дочерних действий для файлов CSS:

  1. Клиент ссылается на наше приложение, используя URL-адрес, например www.ourapp.com/as/www.clientapp.com/then-go-to/path/in/ourapp.
  2. Приведенный выше URL-адрес направляется методу действия, который записывает файл cookie с именем «skin» со значением «www.clientapp.com», а затем перенаправляет его в / path / in / ourapp.
  3. Наш макет (главная страница) содержит @Html.Action в разделе <head>, где должны быть отрисованы CSS-файлы.
  4. Дочернее действие проверяет 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 способа решить эту проблему:

  1. В дочернем действии, которое настраивает css, убедитесь, что файлы существуют на диске, прежде чем сообщать модели представления о том, что они должны быть отображены. Pro с таким подходом состоит в том, что это должно быть довольно легко Недостатки в том, что для его модульного тестирования придется обернуть файл ввода / вывода в сервис, который можно внедрить. Также приложение будет развернуто в Azure. Я думаю, что Azure может читать файловую систему (что и нужно), но не записывать в нее.
  2. Каким-то образом предотвратить возврат 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();
}

1 Ответ

1 голос
/ 09 января 2012

Один из вариантов: , а не переопределить 404 ошибки для запросов CSS.

Для отсутствующих CSS-файлов вернуть статус 404, но оставить тело пустым. Тело не имеет значения для файла CSS, так как человек не видит его, и все, что заботит браузер - это его статус.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...