Как настроить ASP.NET OutputCache в зависимости от http vs https?
Вот сценарий, пользователь открывает незащищенную страницу из нашего WebApp, позвонив ему в PageA, в свой браузер, а затем щелкнет ссылку там, которая приведет их к безопасному экземпляру PageB. Как только в PageB пользователь может впоследствии щелкнуть ссылку, которая вернет их обратно в защищенный экземпляр страницы (которая уже просматривается и находится в OutputCache). Я заметил, что даже несмотря на то, что при обращении к PageB (защищенному) страница PageA обращается по другому URL-адресу, он фактически вытаскивает предыдущую кешированную копию, а делает ее более свежей. Я проверил это поведение в сеансе отладки и был удивлен тем, что ASP.Net использовал один и тот же элемент OutputCache для безопасной копии страницы.
Мой вопрос: почему так? И как я могу указать ASP.Net OutPutCache для обработки доступа с защищенного URL в качестве другого/уникального элемента, чем небезопасный эквивалент?
[Фон]
Недавно мы переключили изображения веб-сайтов на использование Scene7/Akamai для всех изображений. В результате этого мы добавили код, чтобы использовать другой URL Scene7 при просмотре данной страницы в безопасном соединении. Эта проблема OutputCache не позволяет логике, которая выводит защищенный url для выполнения, и приводит к уродливым предупреждениям браузера.
Ответы
Ответ 1
Я думаю, что вы можете сделать схему VaryByCustom = "и добавить это в свой файл Global.asax.cs(в том числе пару других, которые я использую, а также версию приложения и пользователя):
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if (custom.Equals("version", StringComparison.CurrentCultureIgnoreCase))
{
Assembly asm = Assembly.GetExecutingAssembly();
string[] parts = asm.FullName.Split(',');
string version = parts[1].Trim().ToLower();
return version;
}
else if (custom.Equals("user", StringComparison.CurrentCultureIgnoreCase))
{
var user = Membership.Users.CurrentUser;
return null == user ? string.Empty : user.Id.ToString();
}
else if (custom.Equals("scheme", StringComparison.CurrentCultureIgnoreCase))
{
var scheme = context.Request.IsSecureConnection ? "https" : "http";
return scheme;
}
else
return base.GetVaryByCustomString(context, custom);
}
Ответ 2
Это не отвечает на вопрос как сформулированный, но может исключить вашу необходимость варьироваться по схеме. Если вы жестко кодируете "http://" для URL-адресов Scene7, вы можете изменить их на URL-адреса, относящиеся к схеме.
<img src="http://site.scene7.com/images/someimage.jpg" />
=>
<img src="//site.scene7.com/images/someimage.jpg" />
Это заставит браузер автоматически запрашивать ресурс с той же схемой, что и ссылочная страница. Предположим, что у вас есть сертификат SSL для вашего сайта scene7, конечно.
Ответ 3
Я никогда не пробовал, но вы могли бы использовать свойство Outputcache VaryByHeader и заголовок "host", в котором указывается номер хоста Интернета и номер порта запрашиваемого ресурса.
Вопрос, который у меня есть, - это то, почему вы перенаправляетесь на страницу PageA через безопасную страницу после PageB. Если это небезопасная страница, вы не можете исправить перенаправление PageBB, чтобы всегда перенаправлять на небезопасные.