¿Hay alguna forma de comprobar si el usuario tiene una versión diferente del CSS almacenada en caché por su navegador y, si es así, forzar a su navegador a extraer la nueva versión?Forzar navegador para usar el nuevo CSS
Respuesta
No sé si es el uso correcto, pero creo que se puede forzar una recarga del archivo CSS usando una cadena de consulta:
<link href="mystyle.css?SOME_UNIQUE_TEXT" type="text/css" rel="stylesheet" />
recuerdo que solía este método hace años para forzar una recarga de una imagen de cámara web de, pero el tiempo, probablemente ha pasado ...
Debería simplemente compartir una clase ancestro común, luego puede deslizarla con un solo comando js si fuera necesario.
<body class="style2">
<body class="style1">
etc.
Sin utilizar JS, sólo puede mantener el nombre del archivo CSS en una variable de sesión. Cuando se realiza una solicitud a la Página principal, simplemente redacta la etiqueta de enlace css con el nombre de la variable de sesión.
Siendo el nombre del archivo ccs diferente, fuerza al usuario a descargarlo sin necesidad de verificar lo que estaba previamente cargado en el navegador.
Sé que la pregunta era específicamente sobre C# y supongo que de ese servidor de Windows de algún sabor. Como no conozco bien ninguna de esas tecnologías, daré una respuesta que funcionará en PHP y Apache, y es posible que obtenga algo de ella.
Como se sugirió anteriormente, apenas se fija un ID o una clase sobre el cuerpo de la página depende de la consulta ejemplo específico (en PHP)
<?php
if($_GET['admin_page']) {
$body_id = 'admin';
} else {
$body_id = 'normal';
}
?>
...
<body id="<?php echo $body_id; ?>">
...
</body>
Y tu CSS puede apuntar a esto:
body#admin h1 {
color: red;
}
body#normal h1 {
color: blue;
}
etc
en cuanto a la obligatoriedad de CSS descarga, se puede hacer esto en Apache con los módulos mod_expires o mod_headers - para mod_headers, esto en .htaccess dejaría de archivos CSS siendo caché d:
<FilesMatch "\.(css)$">
Header set Cache-Control "max-age=0, private, no-store, no-cache, must-revalidate"
</FilesMatch>
Pero ya que probablemente no estás usando Apache, que no le ayudará mucho :(
respuesta para la pregunta 1
Se podría escribir un control de servidor heredar de System.Web.UI.Control que anula el Renderizar método:
public class CSSLink : System.Web.UI.Control
{
protected override void Render(System.Web.UI.HtmlTextWriter writer)
{
if (... querystring params == ...)
writer.WriteLine("<link href=\"/styles/css1.css\" type=\"text/css\" rel=\"stylesheet\" />")
else
writer.WriteLine("<link href=\"/styles/css2.css\" type=\"text/css\" rel=\"stylesheet\" />")
}
}
e insertar una instancia de esta clase en su MasterPage:
<%@ Register TagPrefix="mycontrols" Namespace="MyNamespace" Assembly="MyAssembly" %>
...
<head runat="server">
...
<mycontrols:CSSLink id="masterCSSLink" runat="server" />
</head>
...
como jeroen suggested puede tener algo como:
<link href="StyleSelector.aspx?foo=bar&baz=foz" type="text/css" rel="stylesheet" />
Luego su StyleSelector.aspx debe ser algo como esto:
<%@ Page Language="cs" AutoEventWireup="false" Inherits="Demo.StyleSelector" Codebehind="StyleSelector.aspx.cs" %>
Y sus StyleSelector.aspx.cs así:
using System.IO;
namespace Demo
{
public partial class StyleSelector : System.Web.UI.Page
{
public StyleSelector()
{
Me.Load += New EventHandler(doLoad);
}
protected void doLoad(object sender, System.EventArgs e)
{
// Make sure you add this line
Response.ContentType = "text/css";
string cssFileName = Request.QueryString("foo");
// I'm assuming you have your CSS in a css/ folder
Response.WriteFile("css/" + cssFileName + ".css");
}
}
}
Esto enviaría al usuario el contenido de un archivo CSS (en realidad cualquier archivo, consulte Seguridad nota) en función de los argumentos de cadena de consulta. Ahora la parte difícil es hacer el GET Condicional, que es el nombre elegante para verificar si el usuario tiene la página en el caché o no.
Antes que nada, le recomiendo que lea HTTP Conditional GET for RSS hackers, un excelente artículo que explica los fundamentos del mecanismo HTTP Conditional GET. Es un debe leer, créanme.
He publicado un similar answer (pero con el código PHP, lo siento) a la pregunta SO can i use “http header” to check if a dynamic page has been changed. Debería ser fácil portar el código de PHP a C# (Lo haré si más tarde tengo el tiempo).
Nota de seguridad: es muy inseguro haciendo algo como ("css /" + cssFileName + ". css "), ya que puede enviar una cadena de ruta relativa y, por lo tanto, puede enviar al usuario el contenido de un archivo diferente. Debes encontrar una forma mejor de averiguar qué archivo CSS enviar.
Nota de diseño: en lugar de una página .aspx es posible que desee utilizar un IHttpModule
o IHttpHandler
, pero de esta manera funciona bien.
Me gusta la sugerencia de jeroen de agregar una cadena de consulta a la URL de la hoja de estilo. Puede agregar la marca de tiempo cuando se modificó por última vez el archivo de la hoja de estilo. Me parece un buen candidato para una función auxiliar o control personalizado que generaría la etiqueta LINK por usted.
- 1. Forzar actualización del caché del navegador para múltiples recursos (CSS y Javascript)
- 2. Forzar navegador para descargar el archivo en lugar de abrirlo
- 3. Forzar javascript para ejecutar * antes * navegador redibujar (ejemplo jsFiddle)
- 4. Forzar navegador para volver a leer las imágenes en caché
- 5. Abrir webview no en el nuevo navegador
- 6. Forzar un nuevo hilo de correo electrónico
- 7. Compatibilidad con el navegador para askerisk (*) comodín en CSS?
- 8. Consultas de medios CSS para el navegador web Amazon Kindle
- 9. Forzar navegador para almacenar en caché las imágenes
- 10. JavaScript: cómo forzar a Image() a no usar el caché del navegador?
- 11. ¿Es posible forzar el uso de "usar" para clases desechables?
- 12. CSS LI hover - ¿compatible con el navegador?
- 13. Cómo forzar al navegador a descargar el archivo?
- 14. ¿Cómo forzar la codificación UTF-8 en el navegador?
- 15. ¿Puedo forzar .htaccess para actualizar?
- 16. Código de Javascript para forzar que la página html se abra en el navegador Chrome?
- 17. Representación del navegador Sprites CSS
- 18. Cuándo usar el signo CSS +
- 19. CSS 100% de ancho en el tamaño del navegador
- 20. ¿Manera cruzada del navegador para girar la imagen usando CSS?
- 21. CSS con lógica de navegador si/entonces
- 22. Cómo usar Content-disposition para forzar la descarga de un archivo en el disco duro?
- 23. Forzar fuente no monoespacial en ancho fijo mediante CSS
- 24. Cuándo usar el posicionamiento de CSS?
- 25. Cambiar el tipo de medio css en el navegador
- 26. Blend-created HTML/CSS ejecutándose en el navegador?
- 27. Cruce el degradado del texto del navegador en css puro sin usar la imagen de fondo
- 28. gradientes de reflexión usando CSS en el navegador Android
- 29. Cómo forzar navegador para establecer conjunto de caracteres en el encabezado HTTP de tipo de contenido
- 30. Nuevo proyecto: Tengo problemas para elegir un idioma para usar