Как решить «Сеанс не был настроен для этого приложения или запроса». - PullRequest
1 голос
/ 09 февраля 2020

Не могу понять, почему я получил "Сессия не была настроена для этого приложения или запроса" в ASP. NET Core 3.1.

Ниже приведен пример кода:

Startup.cs

    public void ConfigureServices(IServiceCollection services)
    {

        this.RepositoryBinder(services);
        var connection = Configuration.GetConnectionString("ProductDB");
        services.AddDbContext<ProductDbContext>(options =>
            options.UseSqlServer(connection));
        services.AddHttpContextAccessor();
        services.AddControllersWithViews();
        services.AddDistributedMemoryCache();
        services.AddSession();

    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseRouting();

        app.UseCookiePolicy();
        app.UseAuthorization();
        app.UseSession();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
        SeedData.Seed(app);
    }

    private void RepositoryBinder(IServiceCollection services)
    {
        services.AddTransient<IProductRepository, ProductRepository>();
        services.AddScoped<CartService>();
    }

Но когда я вызываю следующий метод в CartService.cs :

    private readonly HttpContext _httpContext;
    private readonly IProductRepository _repository;
    private List<BaseProduct> cartProducts = new List<BaseProduct>();

    public CartService(IHttpContextAccessor accessor,
        IProductRepository repository)
    {
        _httpContext = accessor.HttpContext;
        _repository = repository;
    }

    public async void AddToCart(Guid id)
    {
        var product = await _repository.GetById(id);
        cartProducts.Add(product);
          //EXCEPTION here 
        _httpContext.Session.Set(_httpContext.Session.Id, cartProducts); <------------------
    }

SessionExtensions.cs:

public static class SessionExtensions
{
    public static void Set<T>(this ISession session, string key, T value)
    {
        session.SetString(key, JsonConvert.SerializeObject(value));
    }

    public static T Get<T>(this ISession session, string key)
    {
        var value = session.GetString(key);

        return value == null ? default(T) :
            JsonConvert.DeserializeObject<T>(value);
    }
}

ShopController.cs:

    private readonly IProductRepository _repository;
    private readonly CartService _cart;
    public ShopController(IProductRepository repository, CartService cart)
    {
        _repository = repository;
        _cart = cart;
    }

    [HttpPost]
    public IActionResult AddToCart([FromRoute] Guid id)
    {
        _cart.AddToCart(id);
        return RedirectToAction(nameof(Clothes));
    }   

_Single_Product.cs html:

<div class="add-to-cart-btn">
     <form method="post" asp-controller="Shop" asp-action="AddToCart" asp-route-id="@Model.Id">
          <button type="submit"  class="btn essence-btn">Add to Cart</button>
     </form>
</div>

Я получаю «Сеанс не настроен для этого приложения или запроса». Помогите, пожалуйста.

В предыдущей версии ASP. NET Core У меня не было этого исключения. Текущая версия ASP. NET Core - 3.1. Спасибо!

...