Как предложил Джероен , вы можете получить что-то вроде:
<link href="StyleSelector.aspx?foo=bar&baz=foz" type="text/css" rel="stylesheet" />
Тогда ваш файл StyleSelector.aspx должен выглядеть примерно так:
<%@ Page Language="cs" AutoEventWireup="false" Inherits="Demo.StyleSelector" Codebehind="StyleSelector.aspx.cs" %>
А ваш StyleSelector.aspx.cs вот так:
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");
}
}
}
Это отправит пользователю содержимое файла CSS (фактически любого файла, см. Примечание по безопасности) на основе аргументов строки запроса. Теперь сложная часть выполняет условное GET, причудливое имя для проверки, есть ли у пользователя страница в кеше или нет.
Прежде всего, я настоятельно рекомендую вам прочитать HTTP Conditional GET для RSS-хакеров , отличную статью, в которой объясняются основы механизма HTTP Conditional GET. Это должен читать , поверьте мне.
Я отправил аналогичный ответ (но с PHP-кодом, извините) на вопрос SO можно ли использовать «заголовок http», чтобы проверить, была ли изменена динамическая страница, Должно быть легко перенести код с PHP на C # (я сделаю это, если позже у меня будет время.)
Примечание по безопасности: крайне небезопасно делать что-то вроде ("css /" + cssFileName + ".css"), так как вы можете отправить строку относительного пути и, таким образом, вы можете отправить пользователю содержимое другого файла. Вы должны придумать лучший способ узнать, какой CSS-файл отправить.
Примечание о дизайне: вместо страницы ASPX вы можете использовать IHttpModule
или IHttpHandler
, но этот способ работает просто отлично.