1

这可能是这个问题的 .NET 版本。

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

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

我正在使用以下重写规则重写 .jpg 文件web.config

<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 Session 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将不起作用。

交替...

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

4

2 回答 2

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。

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

祝你好运伙计!

于 2010-05-17T19:49:58.280 回答
0

事实证明,这是 Rackspace 无法解决的限制。

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

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

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

于 2010-09-08T21:53:05.403 回答