Как настроить ASP.Net OutputCache, чтобы он варьировался в зависимости от http против https? - PullRequest
14 голосов
/ 14 июля 2009

Вот сценарий: пользователь открывает незащищенную страницу из нашего WebApp, назовем ее PageA, в своем браузере, а затем щелкает там ссылку, которая приводит его к защищенному экземпляру PageB. Оказавшись в PageB, пользователь может впоследствии щелкнуть ссылку, которая возвращает его к безопасному экземпляру PageA (который он уже просматривал и находится в OutputCache). Я заметил, что несмотря на то, что после посещения PageB (безопасного) доступ к PageA осуществляется по другому URL-адресу, на самом деле он вытягивает предыдущую кэшированную копию, а делает новую. Я проверил это поведение в сеансе отладки и был удивлен, что ASP.Net использовал тот же элемент OutputCache для безопасной копии страницы.

Мой вопрос: почему так? И как я могу сказать ASP.Net OutPutCache рассматривать доступ с защищенного URL-адреса как другой / уникальный элемент, чем незащищенный эквивалент?

[фон]

Недавно мы переключили изображения наших веб-сайтов на использование Scene7 / Akamai для всех изображений. В результате мы добавили код для использования разных URL-адресов Scene7 при просмотре данной страницы по защищенному соединению. Эта проблема OutputCache не допускает выполнения логики, которая выводит защищенные URL, и приводит к появлению уродливых предупреждений браузера.

Ответы [ 3 ]

13 голосов
/ 29 сентября 2009

Это не дает ответа на вопрос в том виде, в котором оно сформулировано, но может исключить необходимость изменения схемы. Если вы жестко программируете "http://" для URL-адресов Scene7, вы можете изменить их на относительные к схеме URL-адреса.

<img src="http://site.scene7.com/images/someimage.jpg" />
=>
<img src="//site.scene7.com/images/someimage.jpg" />

Это заставит браузер автоматически запрашивать ресурс по той же схеме, что и ссылающаяся страница. Это предполагает, что у вас есть сертификат SSL для вашего домена scene7.

8 голосов
/ 19 декабря 2009

Я думаю, что вы можете создать схему 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);
    }
1 голос
/ 14 июля 2009

Я никогда не пробовал, но вы могли бы использовать свойство Outputcache VaryByHeader и заголовок "host", который указывает интернет-хост и номер порта запрашиваемого ресурса.

Вопрос, который у меня возникнет, заключается в том, почему вы перенаправляете на PageA через безопасный после PageB. Если это небезопасная страница, не могли бы вы исправить перенаправление PageB, чтобы всегда перенаправлять на незащищенный.

...