Перезапись облака Rackspace jpg вызывает сброс сессии - PullRequest
1 голос
/ 23 апреля 2010

Это может быть .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 возвращает новый файл cookie Session ASP, который разрушает весь мир.

  • Непосредственный доступ к статическому файлу .jpg не вызывает этой проблемы.
  • Прямой доступ к сценарию изображения также не вызывает его.
  • Только перезапись файла .jpg в сценарий .aspx приводит к потере сеанса.

Это не цикл перенаправления - изображение появляется, но сервер кэша отправляет новый файл cookie сеанса, который (поскольку он исходит от моего имени хоста) вызывает сброс сеанса. Вещи, которые я пробовал (из документации Rackspace Как обойти кеш? )

Я добавил 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 ]

1 голос
/ 17 мая 2010

Попробуйте использовать httphandler вместо перезаписи URL.Если перезапись вызывает проблему в Rackspace Cloud, то это должно устранить проблему, поскольку исключает использование перезаписи:

Создайте класс httphandler в папке App_Code:

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, чтобы этот обработчик получал отправленные запросы на файлы JPEG в папке "/ product-images /":

<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, когда не может найти папку.

Еще одна вещь, на которую следует обратить внимание: это, вероятно, лучший способ выполнить то, что вам нужно сделать, потому что обработчикам http не нужно проходить нормальный жизненный цикл страницы ASP.NET, а это означает, что для выполнения требуется меньше памяти и времени.на сервере.

Удачи, чувак!

0 голосов
/ 09 сентября 2010

Оказывается, это ограничение, которое Rackspace не может исправить.

Чтобы решить эту проблему, мне пришлось использовать другой поддомен для размещения изображений (images.site.com). Субдомен был просто псевдонимом основного сайта, но имя хоста не позволяло сбросить сеанс на www.site.com.

Я добавил некоторые изменения, чтобы указать на мой скрипт, обрабатывающий поиск изображений в Web.Config, чтобы сохранить изображения, возвращаемые из этого субдомена, и перенаправить назад, если пользователь просматривал этот субдомен напрямую.

Кроме того, я подозреваю, что ответ Рэйфа ниже также решил бы проблему. Если вы столкнетесь с этой проблемой, вам следует воспользоваться этим решением!

...