Страницы Asp.Net Core Razor, переменная сеанса недоступна из других представлений / моделей бритв - PullRequest
0 голосов
/ 06 ноября 2018

Я сохраняю переменную сеанса на странице входа,

Guid sessionId = Guid.NewGuid();

HttpContext.Session.SetString("sessionId",sessionId.ToString());
Response.Cookies.Append("sessionId", sessionId.ToString());

Теперь я обращаюсь к этой переменной следующим образом:

string sessionId = Request.Cookies["sessionId"];            

if (!String.IsNullOrEmpty(sessionId) && sessionId.Equals(HttpContext.Session.GetString("sessionId")))
{
    return RedirectToPage("/LoggedIn/Index");
}

return Page();

Этот код я использую на той же странице бритвы (странице входа в систему), на которой объявлен идентификатор сессии, однако, если я использую приведенный выше код на любой другой странице просмотра бритвы, я не могу получить доступ к этой переменной сеанса. Он доступен только на той же странице, на которой был сохранен.

Что я могу делать не так?

Ответы [ 4 ]

0 голосов
/ 15 декабря 2018

Мне пришлось изменить весь контекст моего предыдущего комментария. Вот «правильный ответ».

Просто убедитесь, что вы проверили следующие шаги:

  1. services.AddDistributedMemoryCache() память настроена для кэширования.
  2. services.AddSession() вы настроили сеанс.
  3. Здесь люди совершают ошибку. app.UseSession() должен быть вызван после app.UseCookiePolicy() и до app.UseMvc().

** Обратите внимание, что вызов RedirectToPage() не влияет на переменные сеанса вообще. **

Эти шаги выглядят простыми, но на самом деле шаг 3 - это ответ, который вы ищете. Ваш код выглядит абсолютно нормально.

Вот Порядок промежуточного программного обеспечения, описанный Риком Андерсоном и Стивом Смитом. https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/index?view=aspnetcore-2.2#order

Иногда проблема может быть вызвана установкой CheckConsentNeeded = context => true в значение true при настройке параметров CookiePolicyOptions. Просто установите значение false, если у вас настроено <CookiePolicyOptions>.

0 голосов
/ 06 ноября 2018

Сначала вы должны настроить HttpContextAccessor и Session в Startup.cs.

//ConfigureServices
services.AddHttpContextAccessor();
services.AddSession(s => s.IdleTimeout = TimeSpan.FromMinutes(30));

и

//Configure
app.UseSession();

Затем вы можете получить доступ к HttpContext в IHttpContextAccessor в любом месте. Я установил сессию в действии Index.

public class HomeController : Controller
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public HomeController(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }
    public IActionResult Index()
    {
        _httpContextAccessor.HttpContext.Session.SetString("session1", Guid.NewGuid().ToString());
        return View();
    }
}

И получил к нему доступ в About.cshtml

@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor HttpContextAccessor
<h1>Session Value:</h1>
<p>@HttpContextAccessor.HttpContext.Session.GetString("session1")</p>

Надеюсь, это поможет.

0 голосов
/ 06 ноября 2018

Вам необходимо хранилище для данных сеанса. Вы можете использовать кэш памяти для большинства приложений. Вы включаете его с помощью services.AddMemoryCache() в методе ConfigureServices. Смотри https://www.learnrazorpages.com/razor-pages/session-state

0 голосов
/ 06 ноября 2018

Я считаю, что вам нужно использовать Context.Session.TryGetValue вместо HttpContext в .Net Core

Вам понадобится @using Microsoft.AspNetCore.Http; пространство имен в вашем представлении

...