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セッションCookieを返し、それが全世界を破壊することです。

  • 静的な.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ます。

または...

これを修正できない理由を教えてください。

4

2 に答える 2

1

URL 書き換えを使用する代わりに、httphandler を使用してみてください。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 を返さないようにする必要があります。

もう 1 つ注意すべき点は、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 に答える