Q:

How to get and set cookies in web api 2

I am designing an e-commerce shopping cart in ASP.NET. When user clicks 'add to cart', I am checking if the cookie contains a cart ID. If not, I create a new cart, else I retrieve the cart from the database.
The following is the cart service class
using LaptopMart.Contracts;
using LaptopMart.Models;
using System;
using System.Linq;
using System.Web;

namespace LaptopMart.Services
{
public class CartService : ICartService
{
    public const string CartSessionName = "eCommerceCart";

    private readonly IUnitOfWork _unitOfWork;

    public CartService(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }

    public Cart GetCart(HttpContextBase httpContextBase, bool createIfNull)
    {
        HttpCookie cookie = httpContextBase.Request.Cookies.Get(CartSessionName);
        Cart cart = null;
        if (cookie != null)
        {
            string strCartId = cookie.Value;
            int cartId = 0;
            if (!string.IsNullOrEmpty(strCartId))
            {
                cartId = Convert.ToInt32(strCartId);
                cart = _unitOfWork.CartRepository.Read(cartId);
            }
            else if (createIfNull)
            {
                cart = CreateNewCart(httpContextBase);
            }

        } else if (createIfNull)
        {
            cart = CreateNewCart(httpContextBase);
        }

        return cart;
    }

    private Cart CreateNewCart(HttpContextBase httpContextBase)
    {
        Cart cart = new Cart();
        _unitOfWork.CartRepository.Create(cart);
        _unitOfWork.Complete();

        HttpCookie cookie = new HttpCookie(CartSessionName);
        cookie.Value = Convert.ToString(cart.Id);
        cookie.Expires = DateTime.Now.AddDays(1);
        httpContextBase.Response.Cookies.Add(cookie);

        return cart;
    }

    public void AddToCart(int productId, HttpContextBase httpContextBase)
    {
        Cart cart = GetCart(httpContextBase, true);
        var cartItem = cart.CartItems.FirstOrDefault(c => c.ProductId == productId);
        if (cartItem == null)
        {
            cartItem = new CartItem()
            {
                ProductId = productId,
                Quantity = 1
            };

            cart.CartItems.Add(cartItem); 
        }
        else
        {
            cartItem.Quantity += 1;
        }

        _unitOfWork.Complete();
    }

    public void RemoveFromCart(int productId, HttpContextBase httpContextBase)
    {
        Cart cart = GetCart(httpContextBase, false);
        if (cart != null)
        {
            var cartItem = cart.CartItems.FirstOrDefault(c => c.ProductId == productId);
            cart.CartItems.Remove(cartItem);
            _unitOfWork.Complete();
        }

    }

}
}

When user clicks add to cart, this is what I am doing currently from my MVC controller
 public ActionResult AddToCart(string id)
 {
      _cartService.AddToCart(id, this.HttpContext);

      return RedirectToAction("Index");
 }

However, what I want to do is, when the user clicks "add to cart", I want to send an ajax call to the Web Api 2 controller which does not have HttpContext property. Can someone help me with how I would achieve that.

A:

aspnet/web-api/overview/advanced/http-cookies
To add cookies just use create a CookieHeaderValue instance that represents the cookie. Then call the AddCookies extension method, which is defined in the System.Net.Http. HttpResponseHeadersExtensions class.
public HttpResponseMessage Get()
{
    var resp = new HttpResponseMessage();

    var cookie = new CookieHeaderValue("session-id", "12345");
    cookie.Expires = DateTimeOffset.Now.AddDays(1);
    cookie.Domain = Request.RequestUri.Host;
    cookie.Path = "/";

    resp.Headers.AddCookies(new CookieHeaderValue[] { cookie });
    return resp;
}

And to retrive cookies You can use Request.Headers.GetCookies
var cookie = Request.Headers.GetCookies(CartSessionName).FirstOrDefault();

