我们需要为 ASP.NET MVC3 应用程序提供换肤功能。
到目前为止,我的方法是通过 cookie 和 css 文件的子操作来解决这个问题:
- 客户端使用 www.ourapp.com/as/www.clientapp.com/then-go-to/path/in/ourapp 等网址链接到我们的应用。
- 上面的 url 被路由到一个操作方法,该方法写入一个名为“skin”、值为“www.clientapp.com”的 cookie,然后重定向到/path/in/ourapp。
- 我们的布局(主页)有
@Html.Action
在<head>
要渲染 css 文件的部分。 - 子操作检查 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 页面布局上呈现登录/注销链接、水平导航等的部分操作和子操作)。
我认为有两种方法可以解决这个问题:
- 在配置 css 的子操作中,检查以确保文件存在于磁盘上,然后再告诉 View 模型应该渲染它们。这种方法的优点是它应该相当简单。缺点是要对其进行单元测试,必须将文件 I/O 包装在可注入(inject)的服务中。该应用程序还将部署到 Azure。我认为Azure可以读取文件系统(这是所需要的),但不能写入它。
- 以某种方式防止 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/