2010-09-26 11 views
6

Esiste un modo per consentire a TempData di memorizzare nel cookie di un browser anziché in Stato sessione. Ho disabilitato lo stato della sessione sul mio sito.ASP.NET MVC Store TempData in Cookie

Grazie.

+1

Attenzione alle limitazioni della dimensione dei cookie e ai requisiti di serializzabilità! :) – bzlm

risposta

-1

Na ZAF,

Prova questo per rimuovere i cookie:

public void DeleteCookie(string name) 
{ 
    DateTime now = DateTime.UtcNow; 
    string cookieKey = name; 
    var cookie = new HttpCookie(cookieKey, null) 
    { 
     Expires = now.AddDays(-1) 
    }; 
    HttpContext.Response.Cookies.Set(cookie); 
} 

utilizzo:

DeleteCookie("__ControllerTempData"); 
+0

Non ha funzionato neanche. Sembra che la risposta non applichi alcuna modifica, semplicemente non hanno effetto. Questo deve essere un bug! Grazie comunque! –

+0

non ti preoccupare - spero di averlo risolto –

+0

-1: questa risposta non menziona nemmeno TempData – JotaBe

3

È possibile specificare il proprio TempDataProvider personalizzato e scriverlo in modo che venga archiviato nei dati temporanei.

Date un'occhiata a questo blog post per un esempio in cui qualcuno utilizza un provider TempData personalizzato

+0

Si prega di vedere il mio altro thread http://stackoverflow.com/questions/3809379/asp-net-mvc-tempdata-in-browser-cookie –

1

Io uso il seguente file di classe poco:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Runtime.Serialization.Formatters.Binary; 
using System.Web; 
using System.Web.Mvc; 

/* 16-09-2010 
* pulled from Microsoft.Web.Mvc Futures 
* be careful in case future versions of the mvc dll incorporate this 
* 
*/ 

namespace yournamespace 
{ 
    public class CookieTempDataProvider : ITempDataProvider 
    { 
     internal const string TempDataCookieKey = "__ControllerTempData"; 
     readonly HttpContextBase _httpContext; 

     public CookieTempDataProvider(HttpContextBase httpContext) 
     { 
      if (httpContext == null) 
      { 
       throw new ArgumentNullException("httpContext"); 
      } 
      _httpContext = httpContext; 
     } 

     public HttpContextBase HttpContext 
     { 
      get 
      { 
       return _httpContext; 
      } 
     } 

     protected virtual IDictionary<string, object> LoadTempData(ControllerContext controllerContext) 
     { 
      HttpCookie cookie = _httpContext.Request.Cookies[TempDataCookieKey]; 
      if (cookie != null && !string.IsNullOrEmpty(cookie.Value)) 
      { 
       IDictionary<string, object> deserializedTempData = DeserializeTempData(cookie.Value); 

       cookie.Expires = DateTime.MinValue; 
       cookie.Value = string.Empty; 

       if (_httpContext.Response != null && _httpContext.Response.Cookies != null) 
       { 
        HttpCookie responseCookie = _httpContext.Response.Cookies[TempDataCookieKey]; 
        if (responseCookie != null) 
        { 
         cookie.Expires = DateTime.MinValue; 
         cookie.Value = string.Empty; 
        } 
       } 

       return deserializedTempData; 
      } 

      return new Dictionary<string, object>(); 
     } 

     protected virtual void SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values) 
     { 
      var cookieValue = SerializeToBase64EncodedString(values); 

      var cookie = new HttpCookie(TempDataCookieKey) 
          { 
           HttpOnly = true, Value = cookieValue 
          }; 

      _httpContext.Response.Cookies.Add(cookie); 
     } 

     public static IDictionary<string, object> DeserializeTempData(string base64EncodedSerializedTempData) 
     { 
      var bytes = Convert.FromBase64String(base64EncodedSerializedTempData); 
      var memStream = new MemoryStream(bytes); 
      var binFormatter = new BinaryFormatter(); 
      return binFormatter.Deserialize(memStream, null) as IDictionary<string, object>; 
     } 

     public static string SerializeToBase64EncodedString(IDictionary<string, object> values) 
     { 
      var memStream = new MemoryStream(); 
      memStream.Seek(0, SeekOrigin.Begin); 
      var binFormatter = new BinaryFormatter(); 
      binFormatter.Serialize(memStream, values); 
      memStream.Seek(0, SeekOrigin.Begin); 
      var bytes = memStream.ToArray(); 
      return Convert.ToBase64String(bytes); 
     } 

     IDictionary<string, object> ITempDataProvider.LoadTempData(ControllerContext controllerContext) 
     { 
      return LoadTempData(controllerContext); 
     } 

     void ITempDataProvider.SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values) 
     { 
      SaveTempData(controllerContext, values); 
     } 
    } 
} 

e poi aggiungerlo alla mia contoller come tale:

protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 
     TempDataProvider = new CookieTempDataProvider(requestContext.HttpContext); 
    } 

sembra funzionare bene ...

+0

Ho lo stesso codice che è preso da Assembly di futures. Ad ogni modo, vorrei rimuovere il cookie da Response, ma non funziona per me. Puoi controllare il mio altro thread http://stackoverflow.com/questions/3809379/asp-net-mvc-tempdata-in-browser-cookie –

+0

Nazaf - inserirò qui sotto il metodo che uso per rimuovere i cookie (non specifico per tempdata ma dovrebbe funzionare) –

5

È possibile utilizzare Brock fornitore Cookie TempData di Allen. Is fully documented here ed è anche available as a NuGet package.

Prende in considerazione, tra le altre cose, un'importante preoccupazione: la sicurezza.

È molto semplice rendere MVC TempData utilizzare questo pacchetto.

+0

Non funziona con gli aggiornamenti MVC, solo con 3 a 5.1 – regisbsb

Problemi correlati