Avatar billede fanatic Nybegynder
25. marts 2007 - 00:04 Der er 16 kommentarer

Tracking Users

Hej eksperter.

Jeg ønsker at kunne se hvilke personer der er online på min website. Jeg har fulgt følgende artikel:

http://www.eksperten.dk/spm/614674

Jeg får dog følgende fejl efter at have fulgt vejledningen og kører TraceUsers.aspx:

System.NullReferenceException: Object reference not set to an instance of an object. at TraceUsers.Page_Load(Object sender, EventArgs e) in c:\...\TraceUsers.aspx.cs:line 26


Koden til denne fil er vist herunder og det går vist galt når denne linie udføres: HtmlTable tblUserInfo = (HtmlTable)this.FindControl("tblUserInfo");

tblUserInfo bliver ikke sat og er null. Hvordan kan det mon være?


public partial class TraceUsers : System.Web.UI.Page
{
    protected System.Web.UI.WebControls.Label lblErrors;
    protected System.Web.UI.HtmlControls.HtmlTable tblUserInfo;

    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            HtmlTableRow tr;
            HtmlTableCell td;

            //Get the already defined table(server) control
            HtmlTable tblUserInfo = (HtmlTable)this.FindControl("tblUserInfo");
            tblUserInfo.Align = "center";
            tblUserInfo.Border = 2;
            tblUserInfo.BorderColor = "Blue";
            tblUserInfo.BgColor = "lemonchiffon";
            tblUserInfo.CellPadding = 5;

            tr = new HtmlTableRow();
            tr.BgColor = "Blue";
            tr.Attributes.Add("style", "COLOR:Black;FONT-WEIGHT:bold");
            td = new HtmlTableCell();
            td.InnerHtml = "User Name";
            tr.Cells.Add(td);

            td = new HtmlTableCell();
            td.InnerHtml = "Session ID";
            tr.Cells.Add(td);

            td = new HtmlTableCell();
            td.InnerHtml = "Start Time";
            tr.Cells.Add(td);

            td = new HtmlTableCell();
            td.InnerHtml = "Duration(hh:mm:ss)";
            tr.Cells.Add(td);

            td = new HtmlTableCell();
            td.InnerHtml = "Last Visited";
            tr.Cells.Add(td);

            td = new HtmlTableCell();
            td.InnerHtml = "Machine Name";
            tr.Cells.Add(td);

            tblUserInfo.Rows.Add(tr);

            IDictionaryEnumerator CacheEnum = Cache.GetEnumerator();

            int intCount = 0;
            while (CacheEnum.MoveNext())
            {
                UserInfo uInfoCacheItem = (UserInfo)CacheEnum.Entry.Value;
                tr = new HtmlTableRow();
                if ((intCount % 2) == 1)
                {
                    tr.BgColor = "LightCyan";
                }

                td = new HtmlTableCell();
                td.InnerHtml = uInfoCacheItem.UserName;
                tr.Cells.Add(td);

                td = new HtmlTableCell();
                td.InnerHtml = uInfoCacheItem.SessionID;
                tr.Cells.Add(td);

                td = new HtmlTableCell();
                td.InnerHtml = uInfoCacheItem.StartTime;
                tr.Cells.Add(td);

                td = new HtmlTableCell();
                td.InnerHtml = uInfoCacheItem.Duration;
                tr.Cells.Add(td);

                td = new HtmlTableCell();
                td.InnerHtml = uInfoCacheItem.LastPageVisited;
                tr.Cells.Add(td);

                td = new HtmlTableCell();
                td.InnerHtml = uInfoCacheItem.MachineName;
                tr.Cells.Add(td);

                tblUserInfo.Rows.Add(tr);
                intCount += 1;

                tblUserInfo.Visible = true;
            }
        }
        catch (Exception ex)
        {
            //TODO:
            Label1.Text = ex.ToString();
        }
    }

    #region Web Form Designer generated code
    override protected void OnInit(EventArgs e)
    {
        //
        // CODEGEN: This call is required by the ASP.NET Web Form Designer.
        //
        InitializeComponent();
        base.OnInit(e);
    }

    ///
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    ///
    private void InitializeComponent()
    {
        this.Load += new System.EventHandler(this.Page_Load);
    }
    #endregion
}
Avatar billede neoman Novice
25. marts 2007 - 00:43 #1
Og du har bemærket dette i vejledningen ?
"...TraceUsers.aspx:

Add a HtmlTable server control inside th Form tag and name it tblUserInfo
... "
Avatar billede fanatic Nybegynder
25. marts 2007 - 01:12 #2
ja.. jeg går ud fra at det betyder at jeg også skal lave en <tabel id="tblUserInfo" /> i html-editoren men når jeg gør det så brokker kompileren sig over at der allerede findes en kontrol med det navn???

Og det har den vel ret i da jeg erklærer: protected System.Web.UI.HtmlControls.HtmlTable tblUserInfo; i codebehind-filen eller hvad??

Men i følge guiden er det da sådan man skal ik?
Avatar billede fanatic Nybegynder
25. marts 2007 - 01:13 #3
jeg mente: <tabel id="tblUserInfo" runat="Server"/>
Avatar billede neoman Novice
25. marts 2007 - 01:47 #4
Jeg selv bakser med noget ret tilsvarende i VB, og der kan jeg opbygge rækkerne til en tabel som i forvejen er deklareret i ASPX-filen(<tabel id="tblMinTabel" runat="Server"/>) fra min code-behind UDEN nogen eksplicit deklaration af den i code-behind filen.

Har du forsøgt at smide disse linjer ud og se hvad der sker ?

    protected System.Web.UI.HtmlControls.HtmlTable tblUserInfo;

samt
            //Get the already defined table(server) control
            HtmlTable tblUserInfo = (HtmlTable)this.FindControl("tblUserInfo");
Avatar billede neoman Novice
25. marts 2007 - 01:51 #5
Jeg tror hele miseren stammer fra versioner - eksemplet er vist fra VS 2003 mens du og jeg bruger 2005, hvor man har indført partielle klasser, og dermed er hele molevitten i aspx filen i samme klasse som code-behind filen, og derfor er den ekstra deklaration, samt søgen efter tabel-kontrollen i aspx filen, unødvendige.
Avatar billede fanatic Nybegynder
25. marts 2007 - 12:14 #6
Jo tak, jeg har førsøgt det du skriver. Tror du har ret i det med versionerne. Jeg vil kigge på det i aften engang.
Avatar billede fanatic Nybegynder
25. marts 2007 - 12:16 #7
Min Gloabal.asax ser forresten ud som herunder. Jeg tænker på hvordan Application_PreRequestHandlerExecute(....) mon bliver kaldt? Den er bare copy/pasted fra eksemplet.

<%@ Application Language="C#" %>

<script runat="server">

   
    protected void Application_PreRequestHandlerExecute(Object sender, EventArgs e)
    {

        //Every call to the asp.net application can be intercepted
        //through this event
        try
        {
            UserInfo uInfo = new UserInfo();
            uInfo.SessionID = this.Session.SessionID;

            if (HttpContext.Current.Cache[uInfo.CacheKey] != null)
            {
                // Accessing the Cache Item extends the Sliding Expiration automatically.
                string sUrl = HttpContext.Current.Request.RawUrl;
                if (sUrl.LastIndexOf("/") != 0)
                {
                    sUrl = sUrl.Substring(sUrl.LastIndexOf("/") + 1);
                }
                ((UserInfo)HttpContext.Current.Cache[uInfo.CacheKey]).LastPageVisited = sUrl;
            }
        }
        catch (Exception ex)
        {
            //do nothing
        }
    }
   
   
   
   
    void Application_Start(object sender, EventArgs e)
    {
        //Every call to the asp.net application can be intercepted
        //through this event
        try
        {
            UserInfo uInfo = new UserInfo();
            uInfo.SessionID = this.Session.SessionID;

            if (HttpContext.Current.Cache[uInfo.CacheKey] != null)
            {
                // Accessing the Cache Item extends the Sliding Expiration automatically.
                string sUrl = HttpContext.Current.Request.RawUrl;
                if (sUrl.LastIndexOf("/") != 0)
                {
                    sUrl = sUrl.Substring(sUrl.LastIndexOf("/") + 1);
                }
                ((UserInfo)HttpContext.Current.Cache[uInfo.CacheKey]).LastPageVisited = sUrl;
            }
        }
        catch (Exception ex)
        {
            //do nothing
        }

    }
   
    void Application_End(object sender, EventArgs e)
    {
        //  Code that runs on application shutdown

    }
       
    void Application_Error(object sender, EventArgs e)
    {
        // Code that runs when an unhandled error occurs

    }

    void Session_Start(object sender, EventArgs e)
    {
        // Code that runs when a new session is started
        try
        {
            //UserInfo is nothing but a wraper class
            //with some properties and methods. This class is defined at
            //the bottom of this article.

            UserInfo uInfo = new UserInfo();
            uInfo.SessionID = this.Session.SessionID;
            uInfo.UserName = HttpContext.Current.User.Identity.Name;
            uInfo.StartTime = DateTime.Now.ToString();
            uInfo.MachineName = CallingMachineName;

            TimeSpan SessTimeOut = new TimeSpan(0, 0, HttpContext.Current.Session.Timeout, 0, 0);

            HttpContext.Current.Cache.Insert(uInfo.CacheKey, uInfo, null, DateTime.MaxValue, SessTimeOut);

        }
        catch (Exception ex)
        {
            throw new Exception("Error in Session_Start function", ex);
        }

    }

    void Session_End(object sender, EventArgs e)
    {
        // Code that runs when a session ends.
        // Note: The Session_End event is raised only when the sessionstate mode
        // is set to InProc in the Web.config file. If session mode is set to StateServer
        // or SQLServer, the event is not raised.

    }

    private string CallingMachineName
    {
        //This method works for Intranet application
        //and it is not tested for Internet application
        get
        {
            try
            {
                string sTemp = "";
                string sAddr = "";

                sAddr = HttpContext.Current.Request.UserHostAddress;
                System.Net.IPHostEntry host = null;
                host = System.Net.Dns.GetHostByAddress(sAddr);
                if (host != null)
                {
                    sTemp = host.HostName;

                    string[] split = null;
                    string delimStr = ".";
                    char[] delimiter = delimStr.ToCharArray();

                    split = sTemp.Split(delimiter);

                    if (split.GetUpperBound(0) > 0)
                    {
                        sTemp = split.GetValue(split.GetLowerBound(0)).ToString();
                    }

                }

                return sTemp;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
     
</script>
Avatar billede neoman Novice
25. marts 2007 - 13:10 #8
Sikke noget sludder jeg fik skrevet - det er jo forskellen mellem .NET 1.1 og 2.0 som gør sig gældende:)

Din global.asax-ting har jeg ikke erfaring med, så hvis du får problemer er der forhåbentligt en anden som kan hjælpe.
Avatar billede fanatic Nybegynder
25. marts 2007 - 14:28 #9
jojo...men jeg forstod din pointe ;-)
Avatar billede snepnet Nybegynder
29. marts 2007 - 14:26 #10
Har du kigget på MemberShip systemet i ASP.NET 2.0?
Mvh
Avatar billede fanatic Nybegynder
29. marts 2007 - 20:03 #11
nej det har jeg ikke. Kan man bruge det i min situation? Har du et link?

Ellers er der nogen der har et link til et andet sted som forklarer hvordan jeg kan få vist hvilke brugere der er online på min side?
Avatar billede snepnet Nybegynder
29. marts 2007 - 22:32 #12
Du kan få en introduktion til Membership her:
http://www.asp.net/learn/videos/view.aspx?tabid=63&id=45
Og hvis du benytter det - kan du få antallet af online brugere sådan her:
Membership.GetNumberOfUsersOnline();
Mvh
Avatar billede fanatic Nybegynder
30. marts 2007 - 11:22 #13
aha..okay, jo det har jeg faktisk brugt i et andet projekt. I det jeg arbejder på nu styrer jeg selv det hele, så jeg går ud fra at jeg skal lave en masse om, hvis jeg skal bruge membership :-(

Der må da være en nem måde at gøre det på via Gloabal.asax-filen? ;-)
Avatar billede snepnet Nybegynder
30. marts 2007 - 11:45 #14
Avatar billede snepnet Nybegynder
30. marts 2007 - 11:46 #15
(og du kan så nøjes med de linier der vedrører antallet af brugere :o)
Avatar billede snepnet Nybegynder
01. juli 2007 - 09:08 #16
Hvordan går det her?
Mvh
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