ASP.NET MVC Store TempData в Cookie

Есть ли способ позволить TempData хранить в куки браузера вместо состояния сеанса. У меня отключено состояние сеанса на моем сайте.

Благодарю.

 bzlm02 июл. 2011 г., 17:13
остерегайтесь ограничений размера файлов cookie и требований сериализуемости! :)

Ответы на вопрос(4)

чтобы он сохранялся во временных данных.

Взгляните на этоСообщение блога для примера, где кто-то использует пользовательский поставщик временных данных

 user34255229 сент. 2010 г., 04:19
Пожалуйста, смотрите мою другую веткуstackoverflow.com/questions/3809379/...

Я использую следующий маленький файл класса:

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

а затем добавить его в мой контроллер как таковой:

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

вроде нормально работает ...

 user34255229 сент. 2010 г., 04:20
У меня есть тот же код, который взят из сборки фьючерсов. В любом случае, я хотел бы удалить cookie из Response, но он не работает для меня. Можете ли вы проверить мою другую веткуstackoverflow.com/questions/3809379/...
 jim tollan29 сент. 2010 г., 09:24
Назаф - я опубликую ниже метод, который я использую для удаления файлов cookie (не относится к временным данным, но должен работать)

Полностью документирован здесь и это такжедоступны в виде пакета NuGet.

Он принимает во внимание, между прочим, важную проблему: безопасность.

Очень легко заставить MVC TempData использовать этот пакет.

 regisbsb26 сент. 2014 г., 01:24
Не очень приятно с обновлениями MVC, только с 3 до 5.1
Решение Вопроса

попробуйте это для удаления ваших куки:

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

использование:

DeleteCookie("__ControllerTempData");
 JotaBe30 янв. 2014 г., 11:50
-1: этот ответ даже не упоминает TempData
 jim tollan30 янв. 2014 г., 12:23
JotaBe, вы действительно правы, не упоминая TempData. Это, однако, смягчает использование состояния сеанса, что, конечно, было еще одним компонентом вопроса. Кстати - я ценю, что вы на самом деле упомянули, почему вы сделали понижающее голосование, так много людей просто делают это анонимно - я уважаю это. ура сейчас
 JotaBe31 янв. 2014 г., 12:52
@jimtollan: это хорошее решение для проблемы ... но не для проблемы в вопросе. Так что жаль, но никто не найдет вашего решения. Если вы создадите вопрос для этого ответа и переместите этот ответ на этот вопрос, я буду голосовать за него (добавьте комментарий, чтобы сообщить мне, если вы это сделаете). Таким образом, люди с этой проблемой найдут ваше хорошее решение (и, вероятно, проголосуют за него). Если из вопроса возникает новая проблема, ее следует обсудить в комментариях или в новом вопросе со ссылкой в ​​комментариях. По крайней мере, это то, что я смиренно думаю.
 user34255230 сент. 2010 г., 06:31
Это тоже не сработало. Кажется, что Response не применяет никаких модификаций, они просто не вступают в силу. Это должно быть ошибка! Спасибо, в любом случае!
 jim tollan30 сент. 2010 г., 09:05
не беспокойтесь - надеюсь, вы получите это отсортировано

Ваш ответ на вопрос