2015-07-08 3 views
1

Когда я добавляю файл cookie в ответ, в запросе получается два повторяющихся файла cookie. Вот код:ASP.NET MVC cookie duplicate

HttpCookie cookie = Request.Cookies[Constants.CART_COOKIE_KEY]; // 1 "cart" coookie received from a client browser. 
    if (cookie != null) 
    { 
     Request.Cookies.Remove(Constants.CART_COOKIE_KEY); //remove it. Now there is no cookie in the Request 
     cookie.Expires = DateTime.Now.AddYears(2); 
     cookie.Value = "test"; 
     //Response is empty until now 
     Response.Cookies.Set(cookie); // add to the Response, but now there are even two "cart" cookies in the Request. WTF? 
    } 

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

+0

Вы можете проверить количество 'Request.Cookies' после удаления cookie. –

+0

@AmitKumarGhosh да, я написал это в комментарии, это не файлы cookie, ноль. – Wachburn

+0

Что произойдет, если вы создадите новую переменную cookie и не используете существующую переменную 'cookie'? –

ответ

0

Вы удаляете печенье из запроса и добавление нового в ответ, кто знает, в каком состоянии запроса ...

Могу ли я предложить вам использовать OwinMiddleware для изменения куки ответа, так как вы с использованием совместимого стека?

Довольно легко подключить правильную фазу запроса.

public class CartCookieMiddleware : OwinMiddleware 
{ 
    public CartCookieMiddleware(OwinMiddleware next) : base(next) 
    { 

    } 

    /// <summary> 
    /// Process an individual request. 
    /// </summary> 
    /// <param name="context"/> 
    /// <returns/> 
    public override async Task Invoke(IOwinContext context) 
    { 

     // Register an event when response headers are sent 
     context.Response.OnSendingHeaders(state => 
     { 
      // Get response from state 
      var resp = (IOwinResponse)state; 
      // Get request from state 
      var req = resp.Context.Request; 

      var cookie = req.Cookies.FirstOrDefault(c => c.Key.Equals(Constants.CART_COOKIE_KEY, StringComparison.OrdinalIgnoreCase)).Value; 

      if (cookie != null) 
      { 
       resp.Cookies.Delete(Constants.CART_COOKIE_KEY); 
      } 
      else 
      { 
       cookie = "test"; 
      } 

      resp.Cookies.Append(Constants.CART_COOKIE_KEY, cookie, new CookieOptions { HttpOnly = true, Secure = req.IsSecure }); 

     }, context.Response); 

     await Next.Invoke(context); 
    } 
} 
Смежные вопросы