#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:
Ответ №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];
Это условие проверяет как ответ , так и запрос @galdin2. @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;
}