Как сохранить и прочитать файл cookie в Asp.net Mvc

#asp.net-mvc #asp.net-mvc-4 #cookies #key-value

#asp.net-mvc #asp.net-mvc-4 #файлы cookie #ключ-значение

Вопрос:

Я сохраняю свой файл cookie в виде следующего кода:

 public static void SetCookie(string key, string value, int expireDay = 1)
{
        var cookie = new HttpCookie(key , value);
        cookie.Expires = DateTime.Now.AddDays(expireDay);
        HttpContext.Current.Response.Cookies.Add(cookie);
}
 

Значения файлов cookie при сохранении следующие:
введите описание изображения здесь

Читать cookie:

 public static string GetCookie(string key)
{
        string value = string.Empty;

        var cookie = HttpContext.Current.Request.Cookies[key];

        if (cookie != null)
        {
            if (string.IsNullOrWhiteSpace(cookie.Value))
            {
                return value;
            }
            value = cookie.Value;
        }

        return value;
}
 

Проблема в том, что при чтении файла cookie все значения пусты в соответствии с изображением ниже:

введите описание изображения здесь

Комментарии:

1. Я только что понял, что это не asp.net основной вопрос. Можете ли вы вместо этого проверить значение файла cookie в контроллере и посмотреть, работает ли это? И можете ли вы проверить фактический http-запрос / ответ, чтобы узнать, действительно ли установлен файл cookie?

2. Хорошо, как мне это сделать? @galdin

Ответ №1:

Максимальный размер файла cookie составляет 4 КБ.

введите описание изображения здесь

Ответ №2:

На самом деле вы должны читать файлы cookie из заголовка запроса; не ответ!

Ответ №3:

Проблема здесь: HttpContext.Current.Response.Cookies.AllKeys.Contains(key) . Вам нужно прочитать это из запроса. И запишите изменения в ответ.

Вот более простой рабочий пример, который просто выводит «Эй!» и добавляет восклицание при каждом получении:

     public class IndexModel : PageModel
    {
        public string CookieValue = "Hey!";
        private const string COOKIE_KEY = "HEY_COOKIE";

        public void OnGet()
        {
            Request.Cookies.TryGetValue(COOKIE_KEY, out string? actualValue);
            if (actualValue is not null) CookieValue = actualValue   "!";

            // Only required since we're changing the cookie
            // TODO: set the right cookie options
            Response.Cookies.Append(COOKIE_KEY, CookieValue, new CookieOptions { }); 
        }
    }
 
 @page
@model IndexModel

<h1>@Model.CookieValue</h1>
 

Кроме того, при отладке по протоколу HTTP полезно также посмотреть вкладку сети Chrome.

Комментарии:

1. var cookie = HttpContext.Current.Response.Cookies.AllKeys.Contains(key) ? HttpContext.Current.Response.Cookies[key] : HttpContext.Current.Request.Cookies[key]; Это условие проверяет как ответ , так и запрос @galdin

2. @MohammadSalmanian он «проверяет» ответ. Выражение перед ? является проверкой.

3. обновленный пост. var cookie = HttpContext.Current.Request.Cookies[key]; @galdin

Ответ №4:

Ваша проблема в том, что вы использовали HttpContext.Current.Ответ. Вместо этого вы должны объявить параметр в методе SetCookie следующим образом: контекст HttpContext, затем в контроллере, когда вы вызываете метод, вы должны отправить свойство контроллера HttpContext в качестве аргумента.

 public static void SetCookie(HttpContext context, string key, string value, int expireDay = 1)
{
        var cookie = new HttpCookie(key , value);
        cookie.Expires = DateTime.Now.AddDays(expireDay);
        context.Response.Cookies.Add(cookie);
}
 

В контроллере:

 SetCookie(HttpContext, yourKey,yourValue)
 

Вы также должны изменить свой метод getCookie следующим образом:

 public static string GetCookie(HttpContext context,string key)
{
        string value = string.Empty;

        var cookie = context.Request.Cookies[key];

        if (cookie != null)
        {
            if (string.IsNullOrWhiteSpace(cookie.Value))
            {
                return value;
            }
            value = cookie.Value;
        }

        return value;
}