Контекст HTTP равен нулю внутри asp.net основной контроллер

#asp.net-core #asp.net-core-mvc

#asp.net-core #asp.net-core-mvc

Вопрос:

Я использую ASP.Net Ядро 2.1.1. У меня возникла проблема при вызове HttpContext в моем контроллере. Когда я хочу использовать HttpContext, программа возвращает исключение NullReferenceException и говорит, что HttpContext.get возвращает null.get.get.

Я очень смущен, потому что это внутри контроллера. можете ли вы помочь мне с возможными причинами этого?

CartController .cs

 public class CartController : Controller
{
    private readonly IProductServices _productServices;
    private readonly ICartServices _cartServices;

    public CartController(IProductServices productServices, ICartServices cartServices)
    {
        _productServices = productServices;
        _cartServices = cartServices;
        cartServices.Cart = GetCart();
    }

    public RedirectToActionResult AddToCart(int productID, string returnUrl)
    {
        ProductViewModel product = _productServices.GetByID(productID);
        if (product != null)
        {
            _cartServices.AddItem(product, 1);
            SaveCart(_cartServices.Cart);
        }

        return RedirectToAction("Index", new { returnUrl });
    }

    public RedirectToActionResult RemoveFromCart(int productID, string returnUrl)
    {
        ProductViewModel product = _productServices.GetByID(productID);
        if (product != null)
        {
            _cartServices.RemoveLine(product);
            SaveCart(_cartServices.Cart);
        }

        return RedirectToAction("Index", new { returnUrl });
    }

    public IActionResult Index(string returnUrl)
    {
        return View(new CartIndexViewModel()
        {
            Cart = GetCart(),
            ReturnUrl = returnUrl
        });
    }

    private CartViewModel GetCart()
    {
        return HttpContext.Session.GetJson<CartViewModel>("Cart") ?? new CartViewModel();
    }

    private void SaveCart(CartViewModel cart)
    {
        HttpContext.Session.SetJson<CartViewModel>("Cart", cart);
    }
}
  

Когда эта строка вызывает: Cart = GetCart() , она возвращает null.

Startup.cs

 public class Startup
{
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public IConfiguration Configuration { get; }

    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSession();
        services.AddMemoryCache();
        services.AddMvc();
        services.RegisterStartupServices(Configuration);
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseDeveloperExceptionPage();
        app.UseStatusCodePages();
        app.UseStaticFiles();
        app.UseSession();
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: null,
                template: "{category}/Page{page:int}",
                defaults: new { controller = "Product", action = "List" }
                );

            routes.MapRoute(
                name: null,
                template: "Page{page:int}",
                defaults: new { controller = "Product", action = "List", page = 1 }
                );

            routes.MapRoute(
                name: null,
                template: "{category}",
                defaults: new { controller = "Product", action = "List", page = 1 }
                );

            routes.MapRoute(
                name: null,
                template: "",
                defaults: new { controller = "Product", action = "List", page = 1 }
                );

            routes.MapRoute(
                name: "default",
                template: "{controller=Product}/{action=List}/{id?}"
                );
        });
    }
}
  

Я написал коды внедрения зависимостей приложения в другой сборке и вызываю ее из Sturtup.cs

StartupExtensions.cs

 public static class StartupExtensions
{
    public static void RegisterStartupServices(this IServiceCollection services, IConfiguration configuration)
    {
        services.AddDbContext<SportStoreDbContext>(x => x.UseSqlServer(configuration.GetConnectionString("SportStoreDatabase")));

        MapperConfiguration mappingConfig = new MapperConfiguration(mc =>
        {
            mc.AddProfile(new MappingProfile());
        });

        IMapper mapper = mappingConfig.CreateMapper();
        services.AddSingleton(mapper);

        services.AddTransient<IProductServices, ProductServices>();
        services.AddTransient<ICategoryServices, CategoryServices>();
        services.AddTransient<ICartServices, CartServices>();
    }
}
  

Спасибо

Комментарии:

1. Можете ли вы привести пример вашего кода, где HttpContext вызывается?

2. Не существует нормальной ситуации, когда HttpContext внутри контроллера было бы null. Вы должны были бы делать что-то нестандартное / неправильное. Таким образом, нам нужно увидеть ваш код, иначе мы не сможем вам помочь.

3. Что такое HttpContext.get ?

4. @Jay Fridge Я добавляю свой контроллер и код запуска.

Ответ №1:

Вы вызываете свой метод GetCart внутри своего конструктора :

 public CartController(IProductServices productServices, ICartServices cartServices)
{
    _productServices = productServices;
    _cartServices = cartServices;
    cartServices.Cart = GetCart();
}`
...
private CartViewModel GetCart()
{
    return HttpContext.Session.GetJson<CartViewModel>("Cart") ?? new CartViewModel();
}
  

но HttpContext свойство еще не инициализировано. Вы можете иметь контекст Http только во время обработки запроса.