css - .NET MVC3 : Prevent 404 for missing CSS files? 或者在编写 HTML 之前确保文件存在?

标签 css asp.net-mvc-3 azure http-status-code-404 skinning

我们需要为 ASP.NET MVC3 应用程序提供换肤功能。

到目前为止,我的方法是通过 cookie 和 css 文件的子操作来解决这个问题:

  1. 客户端使用 www.ourapp.com/as/www.clientapp.com/then-go-to/path/in/ourapp 等网址链接到我们的应用。
  2. 上面的 url 被路由到一个操作方法,该方法写入一个名为“skin”、值为“www.clientapp.com”的 cookie,然后重定向到/path/in/ourapp。
  3. 我们的布局(主页)有 @Html.Action<head>要渲染 css 文件的部分。
  4. 子操作检查 cookie 并创建一个 View 模型,该 View 模型将告诉部分 View 哪个 <link>要渲染的标签。

css文件结构是基于cookie值的。所以我们的 CSS 内容可能如下所示:

/content
    /www.clientapp.com
        /style1.css
        /style1.css
    /www.client2app.com
        /style1.css
        /style2.css

我愿意听到更好的模式/替代方案,将皮肤应用于布局。但这不是我提出问题的原因。

当前,当文件系统中不存在 css 文件时,此方法存在问题。该请求导致 IIS 返回 404。我们使用自定义页面覆盖 404 页面(不使用 <head> 中具有 @Html.Action 的相同布局)。这会导致 IIS 执行一些不必要的额外处理(例如,在 404 页面布局上呈现登录/注销链接、水平导航等的部分操作和子操作)。

我认为有两种方法可以解决这个问题:

  1. 在配置 css 的子操作中,检查以确保文件存在于磁盘上,然后再告诉 View 模型应该渲染它们。这种方法的优点是它应该相当简单。缺点是要对其进行单元测试,必须将文件 I/O 包装在可注入(inject)的服务中。该应用程序还将部署到 Azure。我认为Azure可以读取文件系统(这是所需要的),但不能写入它。
  2. 以某种方式防止 css 文件返回 404。为此,我们是否必须在 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();
}

最佳答案

一种选择是覆盖 CSS 请求的 404 错误。

对于丢失的 CSS 文件,返回 404 状态,但将正文留空。正文对于 CSS 文件并不重要,因为人类看不到它,浏览器只关心状态。

关于css - .NET MVC3 : Prevent 404 for missing CSS files? 或者在编写 HTML 之前确保文件存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8792674/

相关文章:

visual-studio-2010 - 将 ASP.NET MVC 3 项目部署到 Windows Server 2003 的最简单方法是什么?

c# - 如何使用 C# 将一个文件从 Azure 文件共享中的一个文件夹复制到另一个文件夹?

html - Firefox下 float 栏中Facebook按钮的水平Shif

css - Twitter Bootstrap 的元素边框颜色

c# - 如何在 ASP.NET MVC3 中表示不同的产品级别和功能访问?

azure - 如何在 velero 部署上运行 helm 升级?

c# - 如何使用 Fluent 资源管理器 SDK 获取部署的输出资源?

html - 将三个 div 并排放置,但左右 div 必须重复到浏览器的边缘

CSS Position Absolute Z-Index 问题

asp.net - 如何在 asp.net mvc 回发期间保留部分 View 模型数据