Как перенести cookie.Value с .NET 5 на .NET 6/7? (ядро ASP.NET)

Рассматриваемый код:

var arrVal = cookie.Value.Split('.');

Я попробовал следующий синтаксис в соответствии с документацией, но, похоже, он не работает.

var arrVal = cookie["Value"].Split('.');

Для остальной части кода контекста:

public IList<CookieType> GetAcceptedCookieTypes(HttpContext httpContext)
{
    var result = new List<CookieType>();

    // accepted by default
    result.Add(CookieType.Essential);

    var cookie = httpContext.Request.Cookies["cc_cookie_accept"];

    if (cookie != null)
    {
        var arrVal = cookie.Value.Split('.');

        if (arrVal != null && arrVal.Length > 1)
        {
            var arrCheck = arrVal[1];

            if (arrCheck.Length > 0 && arrCheck[0] == '1')
            {
                result.Add(CookieType.Statistical);
            }
        }
    }

    return result;
}

Это ошибка, которую я получаю:

CS1061: «строка» не содержит определения для «значения», и не удалось найти доступный метод расширения «значение», принимающий первый аргумент типа «строка» (вам не хватает директивы использования или ссылки на сборку?)

Я не знаю о каких-либо изменениях файлов cookie между ASP.NET Core 5 и 6. Какую именно ошибку вы получаете?

Dai 21.11.2022 15:18

Я проверил документы и IRequestCookieCollection[String]всегда возвращал строку? возвращаясь к ASP.NET Core 1.0 . Ваш код не мог быть скомпилирован с ASP.NET Core 5.0, где единственным изменением было добавление аннотации, допускающей значение NULL.

Dai 21.11.2022 15:21

Так или иначе. чтобы исправить это, просто удалите часть .Value.

Dai 21.11.2022 15:22

Спасибо, вроде разобрался! Пожалуйста, ответьте правильно, чтобы я тоже мог принять это как ответ ^^

Munchkin 21.11.2022 15:23

Я отмечаю, что в ASP.NET для .NET Framework (2001–2015) коллекция Request.Cookies действительно возвращала System.Web.HttpCookie объекты, у которых есть свойство .Value, но это совсем не .NET 5.

Dai 21.11.2022 15:23
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
0
5
84
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я проверил документы и IRequestCookieCollection[String]всегда возвращал строку? возвращаясь к ASP.NET Core 1.0 . Ваш код не мог быть скомпилирован с ASP.NET Core 5.0, где единственным изменением было добавление аннотации, допускающей значение NULL.

Я отмечаю, что в ASP.NET для .NET Framework (2001-2015) коллекция Request.Cookies действительно возвращала объекты System.Web.HttpCookie, которые имеют свойство .Value, но это совсем не .NET 5.

Так или иначе. чтобы исправить это, просто удалите часть .Value.

Я смотрел на это недавно, и документация, кажется, немного конфликтует. В Net 6 Core cookie всегда возвращает строку, если я что-то не пропустил, свойства Value нет. Я использую VS2022. Я не добавил ничего особенного в свой проект, чтобы это работало.

Так что я сделал это

Создал модель с вещами, которые я хочу хранить

public class CookieDataViewModel
{
    public int UserId { get; set; }
    public string Language { get; set; } = string.Empty;
}

Затем, чтобы сохранить файл cookie, я делаю это

CookieOptions loginCookie = new() { Expires = DateTime.Now.AddMinutes(5), Path = "/" };

CookieDataViewModel cookieDataViewModel = new CookieDataViewModel { UserId = user.ID, Language = "en" };

string cookieData = JsonConvert.SerializeObject(cookieDataViewModel);

Response.Cookies.Append(userCookieName, cookieData, loginCookie);

И чтобы вернуть его, я делаю это

CookieDataViewModel? cookieDataViewModel = JsonConvert.DeserializeObject<CookieDataViewModel>(cookie);

... cookieDataViewModel.UserId ...
... cookieDataViewModel.Language ...

Это отлично работает для того, что мне нужно :)

Другие вопросы по теме