这可能是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,它打破了整个世界。
这不是重定向循环 - 图像出现,但缓存服务器提交了一个新的会话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
的潜在解决方案无效。
请告诉我为什么无法解决这个问题。
答案 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在下面的答案也解决了这个问题。 如果你遇到这个问题,那就是你应该追求的解决方案!