0

私の.NETコードには、Httpリクエストを処理するカスタムハンドラーがあり、ProcessRequestメソッドではカスタムHttpModuleを呼び出してHttpキャッシュヘッダーを設定します。

HttpModuleは、次のコードを使用してPreSendRequestHeadersメソッドのヘッダーを設定します

HttpCachePolicy cache = response.Cache;
if (cache != null)
{
  cache.SetCacheability(HttpCacheability.Public);
  cache.SetMaxAge(TimeSpan.FromSeconds(varnishDuration));
  response.AppendHeader("Edge-control", String.Concat("!no-store, max-age=", akamaiDuration, "s dca=noop"));
}

IIS 7.5では、プールが統合モードの場合、CacheControlは強制的にプライベートになります。これが私が得たものです:

curl -IXGET -H "Host:myHostName" "http://myServer/mypage"
HTTP/1.1 200 OK
Cache-Control: private
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
Edge-control: !no-store, max-age=300s dca=noop
[...]

IISがCacheControlをプライベートに変更する理由がわかりません。

これが私のweb.configの私のウェブサーバーセクションです:

<pre>
<system.webServer>
    <handlers accessPolicy="Read, Script">
      <add name="OxygenHandler" verb="*" path="*" type="com.eurosport.oxygen.server.modules.OxygenHandlerFactory, OxygenServerModules" />
    </handlers>
    <modules runAllManagedModulesForAllRequests="true">
      <add name="WebServiceCachingModule" type="com.eurosport.toolkit.WebServiceCachingModule, Eurosport.Toolkit" />
    </modules>
  </system.webServer>
</pre>

ここで説明したように、SetSlidingExpirationを追加しようとしました。Cache.SetMaxAgeはIISで機能せず、VS Dev Srvで正常に機能しますが、役に立ちませんでした。

4

2 に答える 2

0

私はそれを私のモジュールの次のコードで動作させることができました:

response.Headers.Remove("Cache-Control");
response.AppendHeader("Cache-Control", "public, max-age=" + varnishDuration.ToString()+", s-max-age=" + varnishDuration.ToString());

汚れているように見えますが、response.CacheControlおよびresponse.Cacheプロパティが統合モードのIISによって使用されていないようです(または一部のモジュールによってオーバーライドされています...)

于 2013-03-27T11:07:58.837 に答える
-1

デフォルトは次のように指定されますSystem.Web.HttpResponse.CacheControl

        /// <devdoc>
        ///    <para>
        ///       Provided for ASP compatiblility. Use the <see cref='System.Web.HttpResponse.Cache'/>
        ///       property instead.
        ///    </para>
        /// </devdoc>
        public string CacheControl {
            get {
                if (_cacheControl == null) {
                    // the default
                    return "private";
                }

                return _cacheControl;
            }

(グローバル)フィルターを介してヘッダーをオーバーライドできますが、これは認証/承認によって引き起こされたエラーページでは機能しません。幸いなことに、各リクエストには優れたエントリポイントがあり、このデフォルトを上書きできます。

// In Global.asax.cs:
        protected void Application_BeginRequest()
        {
            Context.Response.CacheControl = "no-cache";
        }

更新:上記のようにcache-controlを設定すると、バンドルのキャッシュが無効になります。現在、次の回避策を使用しています。明示的に設定されていない場合にのみ、ページのキャッシュ可能性を変更します。'6'のデフォルト値はここから来ています:

// In Global.asax.cs:
        protected void Application_EndRequest()
        {
            if ((int)Response.Cache.GetCacheability() == ((int)HttpCacheability.ServerAndPrivate) + 1)
                Response.Cache.SetCacheability(HttpCacheability.NoCache);
        }

さらに、エラーが発生し、YSOD(黄色のエラーページ)がレンダリングされるReportRuntimeErrorと、フレームワークが呼び出さClearHeadersれ、カスタムのキャッシュ制御設定が上書きされます。私はこれに対する解決策を見つけていません。

于 2021-04-12T07:08:36.817 に答える