如何配置ASP.Net OutputCache因http对https而异?

时间:2009-07-14 00:17:45

标签: asp.net ssl outputcache scene7

以下是该场景,用户从我们的WebApp打开非安全页面,让我们在其浏览器中将其称为PageA,然后单击其中的链接,将其带到PageB的安全实例。进入PageB后,用户可以随后单击一个链接,将其带回到PageA的安全实例(他们已经查看过并在OutputCache中)。我观察到,即使在访问PageB(安全的)之后通过不同的URL访问PageA,它实际上是拉动先前的缓存副本而不是创建一个新的。我在调试会话中验证了这种行为,并且惊讶于ASP.Net使用相同的OutputCache项来获取页面的安全副本。

我的问题是为什么会这样?我如何告诉ASP.Net OutPutCache将安全URL的访问视为与非安全等价物不同/唯一的项目?

[背景]

我们最近将网站图片切换为使用Scene7 / Akamai拍摄所有图像。因此,我们在安全连接上查看给定页面时添加了使用不同Scene7 URL的代码。此OutputCache问题不允许输出安全URL的逻辑执行,并导致丑陋的浏览器警告。

3 个答案:

答案 0 :(得分:13)

这不能回答问题,但它可能会消除您按计划变化的需要。如果您正在为Scene7网址硬编码“http://”,则可以将它们更改为方案相对网址。

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

这将导致浏览器自动请求与引用页面具有相同方案的资源。假设您的scene7域名具有SSL证书。

答案 1 :(得分:8)

我认为您可以执行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 :(得分:1)

我从未尝试过,但您可以使用Outputcache VaryByHeader属性和“host”标头,该标头指定所请求资源的Internet主机和端口号。

我遇到的问题是你为什么要从PageB重定向到PageA over Secure。如果它是一个非安全页面,您无法修复PageB重定向始终重定向到非安全。