Avatar billede jokkejensen Novice
12. december 2011 - 16:28 Der er 9 kommentarer og
1 løsning

C# -> Cookies og Static metoder, i xslt extensions

Hej Eksperter.

Jeg er ved at lave en shop, og har i ro og mag lokalt været overud lykkelig over det hele har fungeret, meeeen når vi så er flere på løsningen komemr der problemer.

De data jeg troede jeg gemte i en lokal cookie, bliver spredt rundt på de brugere der er på sitet, altså en fejl jeg ikke opdagede da jeg testede alene.

Min UserInfo.cs :


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;

namespace SparShop.Utilities
{
    class ShopUser
    {
        public Dictionary<string, string> UserInfo = new Dictionary<string, string>();

        public ShopUser() {

            HttpCookie cookie = new HttpCookie("Spar_Shop_User");
            cookie = HttpContext.Current.Request.Cookies["Spar_Shop_User"];
            if (cookie != null)
                UserInfo = (Dictionary<string, string>)Utilities.SerializationHelper.DeserializeObjectFromBase64StringWithCompression(cookie.Value.Replace("Spar_Shop_User=", ""));           
        }

        public void AddUserInfo(string key, string value)
        {
            if (String.IsNullOrEmpty(key))
            {
                HttpContext.Current.Trace.Warn("Userinfo", "No item found with key");
                return;
            }

            if (String.IsNullOrEmpty(value))
            {
                UserInfo.Remove(key);
                HttpContext.Current.Trace.Warn("Userinfo", "Deleting:" + key);
                SaveToCookie();
                return;
            }

            if (UserInfo.ContainsKey(key))
            {
                UserInfo.Remove(key);
                UserInfo.Add(key, value);
                HttpContext.Current.Trace.Warn("Userinfo", "Updated:" + key + " To:" + value);
               
            }else
            {
                UserInfo.Add(key, value);
                HttpContext.Current.Trace.Warn("Userinfo", "Added:" + key + " value:" + value);
            }

            SaveToCookie();
   
        }


        public string GetUserInfo(string key)
        {
            if (UserInfo.ContainsKey(key))
            {
                HttpContext.Current.Trace.Warn("Userinfo", "Get:" + key + " value:" + UserInfo[key].ToString());
                return UserInfo[key].ToString();
            }
         
            return null;
        }
        /// <summary>
        /// Save object to cookie
        /// </summary>
        public void SaveToCookie()
        {
            HttpCookie cookie = new HttpCookie("Spar_Shop_User");
            cookie.Expires = DateTime.Now.AddDays(100);
            cookie["Spar_Shop_User"] = Utilities.SerializationHelper.SerializeObjectToBase64StringWithCompression(UserInfo);
            HttpContext.Current.Response.Cookies.Add(cookie);
        }
    }
}



Jeg har så en enkelt .cs fil jeg benytter til at lave mine xslt extensions:


        public static void AddUserInfo(string key, string value)
        {
            Utilities.ShopUser u = new Utilities.ShopUser();
            u.AddUserInfo(key, value);
        }

        public static string GetUserInfo(string key)
        {
            Utilities.ShopUser u = new Utilities.ShopUser();
            return u.GetUserInfo(key);
        }

        #endregion


Altså hvis bruger A indtaster noget til AddUserInfo, bliver det samme resultat for bruger A og B vha GetUserInfo.

Why ?

På forhånd tak
Jacob
Avatar billede Syska Mester
12. december 2011 - 17:48 #1
Der er intet i overstående der gør at det bliver delt.

Cookies kommer fra din klient og bliver sendt til serveren som derefter kan bruge dem.

Der må være noget mere kode ...

Alt efter hvad dit mål er ... så opret dit object i starten i Global.asax BeginRequest og Gem igen ved EndRequest.

Hvis du flere gange loader fra Request og gemmer til Response kan du miste information.
Avatar billede jokkejensen Novice
12. december 2011 - 18:00 #2
Hej buzzzz

Det er en umbraco løsning som jeg ved du også har kendskab til.

Rent praktisk laver jeg et asynkront kald med ajax til en template der gemmer dataen, så jeg fyrer bare

SparShop:SetUserInfo('Navn')

til at sætte

og Hvis jeg så læser SparShop:GetUserInfo('Navn') fra en anden pc, så får jeg samme resultat på begge :/..

Det undrer mig også, men troede det havde noget med mine statiske metoder at gøre (er ikke så erfaren inden for C#)
Avatar billede Syska Mester
12. december 2011 - 18:11 #3
Jeg ville sikre mig at der ikke er noget Cache af det. Mener mange af de ting per-default bliver cached server side og det derfor ser ud som om du læser en anden brugers information.

Hvis du laver shop til Umbraco, kan jeg anbefale: www.ucommerce.dk - der får du en masse ting gratis.
Avatar billede jokkejensen Novice
12. december 2011 - 18:23 #4
yes kender godt til Lasse (tidligere kollega) og hans makkers projekt, det passede bare ikke lige ind i en større kædes systemer :/ - forskellige ERP, forskellige leverings/udbringsnings metoder osv osv - rimeligt mange kombinationer..

Jeg tester lige en 28. gang :)

/J
Avatar billede jokkejensen Novice
12. december 2011 - 18:27 #5
Den er altså sikker, de skide data bliver delt.. Hvis jeg skifter på pc A, at jeg vil have udbringning fra Odense, trykker f5, så er det gemt.

Skifter jeg til Ålbæk på PC B, trykker F5 er den der stadig..

På PC A igen, trykker jeg så F5, og der er Ålbæk valgt i stedet for odense.

Det har intet med at det kører lokalt at gøre vel?

Jeg har kun den UserInfo.cs, og en samlet XsltExtension.cs hvor jeg samler alle mine "metoder".
Avatar billede jokkejensen Novice
12. december 2011 - 18:36 #6
uhmm, jeg benytter samme metode til min indkøbkurv, det ser dog ud til at virke :/...

Men jeg kan ikke se forskellen:

Basket.cs

namespace SparShop
{
    class Basket
    {
        public Dictionary<string, int> BasketItems = new Dictionary<string, int>();

        public Basket()
        {
            HttpCookie cookie = new HttpCookie("Spar_Shop");
            cookie = HttpContext.Current.Request.Cookies["Spar_Shop"];                     
            if (cookie != null)
            BasketItems = (Dictionary<string, int>)Utilities.SerializationHelper.DeserializeObjectFromBase64StringWithCompression(cookie.Value.Replace("Spar_Shop=", ""));

         
        }

        public void UpdateToBasket(string itemID, int quantity)
        {
          if (quantity == 0)
            {
                if(BasketItems.ContainsKey(itemID))
                {     
                    BasketItems.Remove(itemID);
                    HttpContext.Current.Trace.Write("Basket", "Deleted item with id:" + itemID);
                }
            }
          else if (quantity != 0 && !String.IsNullOrEmpty(itemID))
          {
              if (BasketItems.ContainsKey(itemID))
              {
                  BasketItems.Remove(itemID);             
              }

              BasketItems.Add(itemID, quantity);
              HttpContext.Current.Trace.Write("Basket", "Added item with id:" + itemID + " quantity:" + quantity.ToString());
          }

            SaveToCookie();         
        }

        public XPathNavigator GetCurrentBasket()
        {
            string xml = "<Basket count=\""+BasketItems.Count.ToString()+"\">";
            XmlDocument x = new XmlDocument();

            foreach(var key in BasketItems)
            {
                xml+="<Item id=\"" + key.Key+ "\" quantity=\""+key.Value+"\"  />";
            }

            xml += "</Basket>";

            x.LoadXml(xml);

         

            return x.CreateNavigator();
           
        }

        public void SaveToCookie()
        {         
   
            HttpCookie cookie = new HttpCookie("Spar_Shop");
            cookie.Expires = DateTime.Now.AddDays(100);
            cookie["Spar_Shop"] = Utilities.SerializationHelper.SerializeObjectToBase64StringWithCompression(BasketItems);
            HttpContext.Current.Response.Cookies.Add(cookie);
            HttpContext.Current.Trace.Warn("just added item");
          // if (HttpContext.Current.Trace.IsEnabled)
          //    HttpContext.Current.Trace.Write("Current State Cookie Size = " + ((string)cookie["value"]).Length);
        }


    }
}


XsltExtension.cs

public static void UpdateBasket(string itemId, int quantity)
        {
            Basket b = new Basket();
            b.UpdateToBasket(itemId, quantity);                         
        }

        public static XPathNavigator GetBasket()
        {
            Basket b = new Basket();
            XPathNavigator x = b.GetCurrentBasket();
            return x;
        }
Avatar billede Syska Mester
12. december 2011 - 18:43 #7
Har du slået cache fra på din Macro?
Avatar billede jokkejensen Novice
12. december 2011 - 18:50 #8
yes, der er ingen cache, det skal dog siges at "GetBasket()" (xpathNodeNavigator) bliver smidt i en variabel i en system_variables.xslt der bliver <xsl:import /> i diverse xslt filer hvor jeg har brug for den..

Kunne være jeg skulle overveje at smide brugerens cookie værdier i en xpathnavigator også, og hente dem på samme måde ?

PT skriver jeg dem bare ud vha <xsl:value-of select="SparShop:GetUserInfo('Name')" />

Men indkøbskurven gemmer jeg som det første ved hvert request i en xsl:variabel
Avatar billede jokkejensen Novice
12. december 2011 - 19:36 #9
<xsl:variable name="Basket" select="SparShop:GetBasket()"></xsl:variable>
    <xsl:variable name="UserInfo" select="SparShop:GetAllUserInfo()"></xsl:variable>

loaded som den første macro gjorde jobbet, så du har nok ret i jeg på en eller anden måde har fucket op i request/respons verdenen.

Så skal lige et fornuftigt stort site igennem og få rettet lidt til :)

Dropper du lige et svar, tak for din tid.
Avatar billede Syska Mester
12. december 2011 - 20:16 #10
Svar.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester