2009-07-20 24 views
0

すべてIISでキャッシュが機能しない?

私は、統合されたデバッガ/ Webサーバーで期待どおりに機能するASP.NET(C#)を持っています。しかし、IISサーバーに移動すると、キャッシュオブジェクトが設定されていないように見えます。誰も助けを提供することはできますか?

ここには、キャッシュとそれに続くクッキーを設定するクラスがあります。

class globals 
    { 
     public NameValueCollection values; 
     private static string m_visitNumber =""; 

    public globals() 
    { 
     string userName = HttpContext.Current.Request.Cookies["PatientDischargeSummary"].Value; 
     values = HttpContext.Current.Cache[userName] as NameValueCollection; 
    } 

    public globals(NameValueCollection form) 
    { 
     // Copy the form values. 
     values = new NameValueCollection(); 
     values.Add("txtCR", form["txtCR"]); 
     values.Add("txtName", form["txtName"]); 



     // Add the values to the cache. 
     //HttpContext.Current.Cache.Insert(form["txtUserName"], values, null, System.Web.Caching.Cache.NoSlidingExpiration, TimeSpan.FromMinutes(5)); 
     HttpRuntime.Cache.Insert(form["txtUserName"], values, null, DateTime.Now.AddMinutes(5), System.Web.Caching.Cache.NoSlidingExpiration); 
     //HttpContext.Current.Cache.Insert(form["txtUserName"], values, null, DateTime.Now.AddMinutes(5), System.Web.Caching.Cache.NoSlidingExpiration); 

     // Add the username to the cookies. 
     HttpCookie cookie = new HttpCookie("PatientDischargeSummary", form["txtUserName"]); 
     cookie.Expires = DateTime.Now.AddMinutes(30); 
     cookie.HttpOnly = true; 
     HttpContext.Current.Response.Cookies.Add(cookie); 
    } 

キャッシュを使用して、私の例:

globals pcs;

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 

      pcs = new globals(); 


      lblActiveEditor.Text = pcs.values["txtName"]; 


     } 

    } 

は、IISの下で、次のエラーを生成します。

[とNullReferenceException:オブジェクト参照のインスタンスに設定されていませんオブジェクト] navigationtest.Demographics.Page_Load(オブジェクト送信者、EventArgs e)in人口統計.ascx.cs:23 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp、Object o、Object t、EventArgs e)+15 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender、EventArgs e)+34 System.Web.UI.Control.OnLoad(EventArgs e)+99 System.Web.UI.Control.LoadRecursive()+47 System.Web.UI.Control.LoadRecursive()+131 System.Web.UI .Control.LoadRecursive()+131 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint、Boolean includeStagesAfterAsyncPoint)+1061

いずれかの考え?

答えて

0

HttpRuntime.Cacheの代わりにHttpContext.Cacheを使用する必要がありますか?

+0

はい、それは私が元々持っていたものですが、私は同じ問題に遭遇しました。 –

+0

最初のものは2番目のショートカットです。 – user134706

1
pcs.values["txtName"] 

これはnullで、受信しようとしているときに既にキャッシュから削除されています。あなたのコードは、ユーザーの入力から取得された要求ごとのデータをキャッシュしているように見え、キャッシュ内にそのデータの可用性を保証するものは何もありません。

すべてのキャッシュアクセスは、ミス時にデータソースからデータを取得するように準備されている必要があります。その場合、ユーザーのセッションを使用します(ただし、アーキテクチャー、サーバーの数はわかりません)。 ..)ユーザーのセッションを使用すると、そのデータがappdomainまたはセッション自体(いずれか最初に終了するもの)の間存続するため、miss/timeout/appdomainのシャットダウンの場合にも再度照会する必要があります。

+0

起動時にキャッシュにデータを投入しています: if (Request["txtUserName"] != null) { userName = Request["txtUserName"]; // Populate the cache with the initial form values from PCS. pcs = new globals(Request.Form); } else { userName = Request.Cookies["PatientDischargeSummary"].Value; pcs = new globals(); Response.Write(userName); } しかし、なぜこれはIISではなくデバッグモードで動作しますか? –

+0

「スタートアップ」ではログインページを意味すると思います。私が言ったように、このデータがユーザー固有であり、そのユーザーの要求コードの外でアクセスする必要がない場合は、ユーザーのセッションにそのデータを格納することを検討する必要があります。 – user134706

関連する問題