Я устанавливаю и получаю файлы cookie в веб-приложении ASP.NET Core. В Microsoft Docs написано: " После добавления файла cookie с помощью коллекции HttpResponse.Cookies этот файл cookie сразу становится доступным в коллекции HttpRequest.Cookies, даже если ответ не был отправлен клиенту ". Однако я обнаружил, что файл cookie не может быть прочитан сразу после установки; см. Set () ниже, который всегда возвращает false. Тем не менее, инспектор хранилища браузера показывает, что он действительно установлен.

SO 3230133 поднял ту же проблему в контексте PHP, и ответ предполагает, что файл cookie не устанавливается, пока ответ не будет отправлен обратно клиенту, и недоступен в вашем PHP до следующего запроса от клиента после этого. Верно ли это в контексте ASP.NET Core? Есть ли обходной путь, аналогичный PHP $ _COOKIE ['uname'], для установки где-нибудь значения cookie, чтобы его можно было прочитать перед следующим запросом от клиента?

Документы Microsoft относятся к .NetFramework 4.8, но альтернативы для .Net Core нет. Это то, что работает для первого, но не для второго?

public class MyCookies
{
   public IHttpContextAccessor Accessor { get; private set; }

   public MyCookies(IHttpContextAccessor accessor)
   {
      Accessor = accessor;
   }

   public bool Set(string name, string value)
   {
      var rc = false;
      Accessor.HttpContext.Response.Cookies.Append(name, value); 
      if (Accessor.HttpContext.Request.Cookies.TryGetValue(name, out var result) && (result == value))
         rc = true;
      return rc;
   }
}

public class SettingsModel : PageModel
{
   private readonly IHttpContextAccessor _httpContextAccessor;

   public SettingsModel(IHttpContextAccessor httpContextAccessor)
   {
      _httpContextAccessor = httpContextAccessor;
   }

   public IActionResult OnPost()
   {
      var cookies = new MxCookies(_httpContextAccessor);
      if (cookies.SetValue(".AspNetCore.Culture", "fr-CH") == false)
      {
         var stop = true; 
      }
      return new RedirectToPageResult("Index");
   }
}

Не забудьте вызвать services.AddHttpContextAccessor () в Startup.ConfigureServices ()

0
wpqs 27 Июл 2020 в 14:12

2 ответа

Лучший ответ

К сожалению, в .NET Core cookie НЕ доступен сразу в коллекции HttpRequest.Cookies. В этом отношении поведение отличается от поведения Framework, что подтверждается в ASP.NET Core issue 24442 .

Я надеялся использовать Cookie для хранения параметра культуры, определенного в промежуточном программном обеспечении, потому что я подозреваю, что его сохранение Thread.CurrentThread.CurrentUICulture не будет работать в асинхронных методах, поскольку нет гарантии, что поток будет таким же, как тот, который использовался для настройки сделано моим промежуточным программным обеспечением. Может ли кто-нибудь предложить обходной путь?

0
wpqs 31 Июл 2020 в 08:54

Это может быть связано с тем, что приложение GDPR и .NET Core не устанавливает важные файлы cookie без явного согласия.

Взгляните на https: // docs. microsoft.com/en-us/aspnet/core/security/gdpr?view=aspnetcore-2.1

По сути, вам необходимо указать следующие параметры при настройке файла cookie:

var options = new CookieOptions
{
    Expires = DateTime.Now.AddMinutes(60),
    IsEssential = true
};

Accessor.HttpContext.Response.Cookies.Append(name, value, options);
0
ben_mj 27 Июл 2020 в 11:57