Rackspace Cloud重写jpg会导致会话重置

时间:2010-04-23 15:36:10

标签: .net url-rewriting session-state mosso rackspace-cloud

这可能是this question的.NET版本。

我有一个包含以下内容的图像脚本:

...
Response.WriteFile(filename);
Response.End();

我使用web.config中的以下重写规则重写.jpg文件:

<rule name="Image Redirect" stopProcessing="true">
  <match url="^product-images/(.*).jpg" />
  <conditions>
    <add input="{REQUEST_URI}" pattern="\.(jp?g|JP?G)$" />
  </conditions>
  <action type="Rewrite" url="/product-images/ProductImage.aspx?path=product-images/{tolower:{R:1}}.jpg" />
</rule>

它基本上只是将图像路径重写为查询参数。

问题在于(当然是间歇性的)Mosso会返回一个新的ASP会话cookie,它打破了整个世界。

  • 直接访问静态.jpg文件不会导致此问题。
  • 直接访问图像脚本也不会导致它。
  • 仅将.jpg文件重写为.aspx脚本会导致会话丢失。

这不是重定向循环 - 图像出现,但缓存服务器提交了一个新的会话cookie,因为它来自我的主机名,导致会话重置。


我尝试过的事情

(来自Rackspace文档How can I bypass the cache?

我为图片脚本本身添加了Private缓存:

Response.Cache.SetCacheability(HttpCacheability.Private);

我尝试将这些缓存禁用节点添加到web.config:

<staticContent>
  <clientCache cacheControlMode="DisableCache" />
</staticContent>

<httpProtocol>
  <customHeaders>
    <add name="Cache-Control private" value="Cache-Control private"
  </customHeaders>
</httpProtocol>

我需要的解决方案

无法禁用浏览器缓存。这意味着涉及Cache.SetNoStore()HttpCacheability.NoCache的潜在解决方案无效。

可替换地...

请告诉我为什么无法解决这个问题。

2 个答案:

答案 0 :(得分:1)

尝试使用httphandler而不是使用URL重写。如果是重写导致Rackspace Cloud出现问题,那么这应该解决问题,因为它消除了重写的使用:

在App_Code文件夹中创建一个httphandler类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IO;
/// <summary>
/// Summary description for ProductImageHandler
/// </summary>
public class ProductImageHandler : IHttpHandler
{
    public ProductImageHandler()
    {

    }

    #region IHttpHandler Members

    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "image/jpg";

        // get path to image
        string pathString = Path.GetFileNameWithoutExtension(context.Request.RawUrl);

        // open file
        // ... insert your logic for manipulating pathString
        // so that it points to file you want to output
        // maybe something like pathString = "~/images/" + pathString + ".jpg";

        context.Response.WriteFile(pathString);
    }

    #endregion
}

然后在web.config文件中设置条目,以便此处理程序在“/ product-images /”文件夹中获取JPEG文件的请求:

<httpHandlers>
    <add verb="*" path="*/product-images/*.jpg" type="ProductImageHandler" validate="false"/>
</httpHandlers>

还有集成的IIS模式:

<handlers>
    <add name="ProductImageHandler" preCondition="integratedMode" verb="*" path="*/product-images/*.jpg" type="ProductImageHandler"/>
</handlers>

最后一件事 - 您可能需要创建一个名为“product-images”的物理文件夹,以便IIS在找不到该文件夹​​时不会返回404.

另外需要注意的是,这可能是一种更好的方法来完成您需要做的事情,因为httphandlers不必经历正常的ASP.NET页面生命周期,这意味着这需要更少的内存和时间在服务器上执行。

祝你好运!

答案 1 :(得分:0)

事实证明,这是Rackspace无法修复的限制。

要解决这个问题,我必须使用不同的子域来托管图像(images.site.com)。 子域只是主站点的别名,但主机名使会话无法在www.site.com上重置。

我添加了一些重写指向我的脚本处理图像检索到Web.Config以保持图像从该子域返回,并在用户直接浏览该子域时重定向。

另外,我怀疑Rafe在下面的答案也解决了这个问题。 如果你遇到这个问题,那就是你应该追求的解决方案!