2010-09-26 15 views
6

¿Hay alguna manera de dejar que TempData almacene en la cookie de un navegador en lugar de estado de sesión? Tengo Session State deshabilitado en mi sitio.ASP.NET MVC Store TempData en Cookie

Gracias.

+1

¡tenga cuidado con las limitaciones de tamaño de cookie y los requisitos de serialización! :) – bzlm

Respuesta

-1

Na ZAF,

probar esto para eliminar las cookies:

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); 
} 

uso:

DeleteCookie("__ControllerTempData"); 
+0

Tampoco funcionó. Parece que Response no aplica ninguna modificación, simplemente no surten efecto. ¡Esto debe ser un insecto! ¡Gracias de todos modos! –

+0

no se preocupe, espero que lo haya ordenado –

+0

-1: esta respuesta ni siquiera menciona TempData – JotaBe

3

Puede especificar su propio TempDataProvider personalizado y escribirlo para que se almacene en datos temporales.

Tome un vistazo a este blog post para ver un ejemplo en el que alguien utiliza un proveedor TempData encargo

+0

Consulte mi otro hilo http://stackoverflow.com/questions/3809379/asp-net-mvc-tempdata-in-browser-cookie –

1

utilizo el siguiente pequeño archivo de clase:

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); 
     } 
    } 
} 

y luego añadirlo a mi controlador de como tal:

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

parece funcionar bien ...

+0

Tengo el mismo código que se toma del ensamblaje de futuros. De todos modos, me gustaría eliminar la cookie de Response, pero no funciona para mí. Puedes consultar mi otro hilo http://stackoverflow.com/questions/3809379/asp-net-mvc-tempdata-in-browser-cookie –

+0

Nazaf - Publicaré a continuación el método que utilizo para eliminar las cookies (no específico de tempdata pero debería funcionar) –

5

Usted puede utilizar Brock proveedor de Cookies TempData de Allen. Is fully documented here y también es available as a NuGet package.

Tiene en cuenta, entre otras cosas, una preocupación importante: la seguridad.

Es realmente fácil hacer que MVC TempData use este paquete.

+0

No funciona bien con las actualizaciones de MVC, solo con 3 a 5.1 – regisbsb