ASP.NET: XML计数器第二版
你当前的位置:烁空 --> 技术文档全集
CODE:
1) COUNTER.ASPX :- THE COUNTER PAGE

<%@ IMPORT NAMESPACE="SYSTEM.IO" %>
<%@ ASSEMBLY NAME="SYSTEM.XML" %>
<%@ IMPORT NAMESPACE="SYSTEM.XML" %>
<%@ PAGE LANGUAGE="C#" ENABLESESSIONSTATE="TRUE" %>
<%-- THESE ARE THE IMPORTED ASSEMBILES AND NAMESPACES NEED TO RUN THE COUNTER --%>
<HTML>
<HEAD>
<TITLE>SAURABH'S XML COUNTER SCRIPT</TITLE>
<SCRIPT LANGUAGE="C#" RUNAT="SERVER">
//SCRIPT IS CALLED WHEN THE PAGE IS LOADED
PUBLIC VOID PAGE_LOAD(OBJECT SRC, EVENTARGS E)
{
//THE PATH TO THE XML FILE WHICH WILL CONTAIN ALL THE DATA
//MODIFY THIS IF YOU HAVE ANY OTHER FILE OR DIRECTORY MAPPINGS.
//MODIFY THIS IF YOU HAVE BEEN DIRECTED HERE FROM STEP 2 OF THE README FILE.
STRING DATAFILE="DB/XMLCOUNTER.XML" ;

IF(!PAGE.ISPOSTBACK){
//TRY-CATCH BLOCK CONTAINING THE COUNTER CODE
TRY {
//CREATE AN INSTANCE OF THE CLASS XMLDOCUMENT
XMLDOCUMENT XMLDOCUMENT = NEW XMLDOCUMENT() ;

//OPEN A FILESTREAM TO THE SPECIFIED FILE
FILESTREAM FIN ;
//IT IS VERY IMPORTANT TO SPECIFY THE "FILESHARE.READWRITE" OPTION.
//THIS ALLOWS OTHER VIEWERS TO ALSO READ AND WRITE TO THE DATABASE
//THIS WAS MISSING IN MY LAST RELEASE HENCE THERE WAS A BUG !!!
FIN = NEW FILESTREAM(SERVER.MAPPATH(DATAFILE), FILEMODE.OPEN, FILEACCESS.READ,
FILESHARE.READWRITE) ;
//LOAD THE DOCUMENT
XMLDOCUMENT.LOAD(NEW STREAMREADER(FIN)) ;
FIN.CLOSE();
//CREATE AN INSTANCE OF THE DOCUMENTNAVIGATOR CLASS USED TO
//NAVIGATE THROUGH AND XML FILE
DOCUMENTNAVIGATOR NAVIGATOR = NEW DOCUMENTNAVIGATOR(XMLDOCUMENT) ;

//MOVE TO THE FIRST ELEMENT (IN MY FILE 'VISITORS')
NAVIGATOR.MOVETODOCUMENTELEMENT() ;
//MOVE TO IT CHILD AT POSITION '0' (IE.IN MY FILE 'TOTAL' NODE)
NAVIGATOR.MOVETOCHILD(0) ;

//CHECK IF WE ARE ON THE RIGHT ELEMENT WHICH HAS AN ATTRIBUTE
IF (NAVIGATOR.HASATTRIBUTES) {
//GET THE ATTRIBUTE OF THE NODE 'TOTAL' CALLED 'TOT' (SEE THE XMLCOUNTER.XML FILE)
//SINCE THE VALUE STORED IS IN A STRING FORMAT WE 'CAST' IT INTO A INT TYPE
INT TOTAL = INT.PARSE(NAVIGATOR.GETATTRIBUTE("TOT")) ;
//INCREASE THE COUNTER
TOTAL++ ;
//SHOW THE COUNTER ON THE PAGE
COUNTMESS.TEXT = "YOU ARE VISITOR NO: "+TOTAL.TOSTRING() ;
//SAVE THE INCREMENTED COUNTER BACK IN THE XML FILE
NAVIGATOR.SETATTRIBUTE(0,TOTAL.TOSTRING() );
}

//UPDATE THE DATABASE ONLY IF A NEW SESSION IS THERE
IF(SESSION["COUNTER"]==NULL)
{
//MOVE BACK TO THE DOCUMENT ELEMENT
NAVIGATOR.MOVETODOCUMENTELEMENT() ;
NAVIGATOR.MOVETOCHILD(0) ;
//THEN INSERT THE ELEMENT AFTER THE 'TOTAL' ELEMENT WHICH WILL CONTAIN ALL
//THE INFORMATION OF A SINGLE VISITOR
NAVIGATOR.INSERT(TREEPOSITION.AFTER , XMLNODETYPE.ELEMENT, "VIEWER","","") ;
//MAKE AN INSTANCE TO THE HTTPURL CLASS TO GET INFORMATION OF THE REFERRER TO
//THE PAGE IF ANY. IF THERE ARE NO REFERRERS THEN BY DEFAULT THIS OBJECT IS 'NULL'
//SO WE HAVE TO MAKE A CHECK IF IT IS NULL AND DO THE NEEDFUL
HTTPURL OBJURL = REQUEST.URLREFERRER;
IF(OBJURL!=NULL)
{
NAVIGATOR.INSERT(TREEPOSITION.FIRSTCHILD, XMLNODETYPE.ELEMENT,"REFERRER","","");
NAVIGATOR.INSERT(TREEPOSITION.FIRSTCHILD, XMLNODETYPE.TEXT,"REFERRER","","") ;
NAVIGATOR.VALUE = OBJURL.HOST ;
}
ELSE
{
NAVIGATOR.INSERT(TREEPOSITION.FIRSTCHILD, XMLNODETYPE.ELEMENT,"REFERRER","","");
NAVIGATOR.INSERT(TREEPOSITION.FIRSTCHILD, XMLNODETYPE.TEXT,"REFERRER","","") ;
NAVIGATOR.VALUE = "DIRECT" ;
}
//RELEASE THE RESOURCE FOR GARBAGE COLLECTION
OBJURL=NULL ;
//MOVE TO PARENT NODE AND THEN INSERT THE INFORMATION ABOUT THE USERAGENT
NAVIGATOR.MOVETOPARENT() ;
NAVIGATOR.INSERT(TREEPOSITION.AFTER, XMLNODETYPE.ELEMENT,"USERAGENT","","" ) ;
NAVIGATOR.INSERT(TREEPOSITION.FIRSTCHILD, XMLNODETYPE.TEXT,"USERAGENT","","" ) ;
NAVIGATOR.VALUE = REQUEST.USERAGENT ;
NAVIGATOR.MOVETOPARENT() ;
NAVIGATOR.INSERT(TREEPOSITION.AFTER, XMLNODETYPE.ELEMENT,"USERHOSTADDRESS","","" ) ;
NAVIGATOR.INSERT(TREEPOSITION.FIRSTCHILD, XMLNODETYPE.TEXT,"USERHOSTADDRESS","","" ) ;
NAVIGATOR.VALUE = REQUEST.USERHOSTADDRESS ;
NAVIGATOR.MOVETOPARENT() ;
NAVIGATOR.INSERT(TREEPOSITION.AFTER, XMLNODETYPE.ELEMENT,"USERHOSTNAME","","" ) ;
NAVIGATOR.INSERT(TREEPOSITION.FIRSTCHILD, XMLNODETYPE.TEXT,"USERHOSTNAME","","" ) ;
NAVIGATOR.VALUE = REQUEST.USERHOSTNAME ;
//TO GET MORE INFORMATION OF THE USERS BROWSERS CAPABILITIES MAKE AN OBJECT
//OF THE HTTPBROWSERCAPABILITIES CLASS
HTTPBROWSERCAPABILITIES BC = REQUEST.BROWSER;

NAVIGATOR.MOVETOPARENT() ;
NAVIGATOR.INSERT(TREEPOSITION.AFTER, XMLNODETYPE.ELEMENT,"BROWSERTYPE","","" ) ;
NAVIGATOR.INSERT(TREEPOSITION.FIRSTCHILD, XMLNODETYPE.TEXT,"BROWSERTYPE","","" ) ;
NAVIGATOR.VALUE = BC.TYPE ;

NAVIGATOR.MOVETOPARENT() ;
NAVIGATOR.INSERT(TREEPOSITION.AFTER, XMLNODETYPE.ELEMENT,"BROWSERNAME","","" ) ;
NAVIGATOR.INSERT(TREEPOSITION.FIRSTCHILD, XMLNODETYPE.TEXT,"BROWSERNAME","","" ) ;
NAVIGATOR.VALUE = BC.BROWSER ;

NAVIGATOR.MOVETOPARENT() ;
NAVIGATOR.INSERT(TREEPOSITION.AFTER, XMLNODETYPE.ELEMENT,"MAJORVERSION","","" ) ;
NAVIGATOR.INSERT(TREEPOSITION.FIRSTCHILD, XMLNODETYPE.TEXT,"MAJORVERSION","","" ) ;
NAVIGATOR.VALUE = BC.MAJORVERSION.TOSTRING() ;

NAVIGATOR.MOVETOPARENT() ;
NAVIGATOR.INSERT(TREEPOSITION.AFTER, XMLNODETYPE.ELEMENT,"MINORVERSION","","" ) ;
NAVIGATOR.INSERT(TREEPOSITION.FIRSTCHILD, XMLNODETYPE.TEXT,"MINORVERSION","","" ) ;
NAVIGATOR.VALUE = BC.MINORVERSION.TOSTRING(); ;

NAVIGATOR.MOVETOPARENT() ;
NAVIGATOR.INSERT(TREEPOSITION.AFTER, XMLNODETYPE.ELEMENT,"PLATFORM","","" ) ;
NAVIGATOR.INSERT(TREEPOSITION.FIRSTCHILD, XMLNODETYPE.TEXT,"PLATFORM","","" ) ;
NAVIGATOR.VALUE = BC.PLATFORM ;

//MAKE AN OBJECT OF THE DATETIME CLASS TO GET THE DATE TIME
DATETIME NOW = DATETIME.NOW ;
NAVIGATOR.MOVETOPARENT() ;
NAVIGATOR.INSERT(TREEPOSITION.AFTER, XMLNODETYPE.ELEMENT,"DATE","","" ) ;
NAVIGATOR.INSERT(TREEPOSITION.FIRSTCHILD, XMLNODETYPE.TEXT,"DATE","","" ) ;
NAVIGATOR.VALUE = NOW.TOSHORTDATESTRING() ;

NAVIGATOR.MOVETOPARENT() ;
NAVIGATOR.INSERT(TREEPOSITION.AFTER, XMLNODETYPE.ELEMENT,"TIME","","" ) ;
NAVIGATOR.INSERT(TREEPOSITION.FIRSTCHILD, XMLNODETYPE.TEXT,"TIME","","" ) ;
NAVIGATOR.VALUE = NOW.TOSHORTTIMESTRING() ;
//CREATE A FILE STREAM AGAIN TO WRITE TO THE DATABASE
//AGAIN REMEMBER TO SPECIFY THE "FILESHARE.READWRITE"
FILESTREAM FOUT ;
FOUT = NEW FILESTREAM(SERVER.MAPPATH(DATAFILE), FILEMODE.OPEN, FILEACCESS.WRITE,
FILESHARE.READWRITE) ;

//FINALLY SAVE THE USER DATA TO THE XML DATABASE FILE
XMLDOCUMENT.SAVE(NEW STREAMWRITER(FOUT)) ;
//FREE THE RESOURCES EXPLICITLY FOR OTHER CLASSES TO USE
FOUT.CLOSE();
NAVIGATOR=NULL ;
XMLDOCUMENT=NULL ;
//JUST STORE ANY VALUE TO THE SESSION
SESSION["COUNTER"]=1 ;
}

}
CATCH(EXCEPTION EDD)
{
//CATCH OTHER EXCEPTIONS
RESPONSE.WRITE("<FONT COLOR=#FF0000>AN EXCEPTION OCCURRED "+EDD.TOSTRING()+"</FONT>") ;
}

}
}

</SCRIPT>
</HEAD>

<BODY >

<H3 ALIGN="CENTER">WELCOME TO SAURABH'S COUNTER SCRIPT</H3>
<BR>
<P ALIGN="CENTER">
THIS IS A SAMPLE PAGE WHICH HAS THE COUNTER SCRIPTING IN IT.
TAKE THE SCRIPT FROM THIS PAGE AND PASTE IT ON YOUR PAGE.

</P>
<ASP:LABEL TEXT="YOU ARE VISITOR NO: 0" STYLE="FONT-SIZE:28PT" ID="COUNTMESS" RUNAT="SERVER" />


</BODY>

</HTML>





2) VIEWCOUNTER.ASPX : THE COUNTER INFORMATION VIEWING PAGE

<%@ IMPORT NAMESPACE="SYSTEM" %>
<%@ IMPORT NAMESPACE="SYSTEM.IO" %>
<%@ IMPORT NAMESPACE="SYSTEM.DATA" %>
<%@ ASSEMBLY NAME="SYSTEM.XML" %>
<%@ IMPORT NAMESPACE="SYSTEM.XML" %>
<%@ PAGE LANGUAGE="C#" %>
<HTML>
<HEAD>
<TITLE>SAURABH'S XML COUNTER SCRIPT</TITLE>
<SCRIPT LANGUAGE="C#" RUNAT=SERVER>
//THIS SCRIPT IS EXECUTE WHEN THE PAGE IS LOADED
PUBLIC VOID PAGE_LOAD(OBJECT SENDER, EVENTARGS E)
{
//THE PATH TO THE XML FILE WHICH WILL CONTAIN ALL THE DATA
//MODIFY THIS IF YOU HAVE ANY OTHER FILE OR DIRECTORY MAPPINGS.
//MODIFY THIS IF YOU HAVE BEEN DIRECTED HERE FROM STEP 2 OF THE README FILE.
STRING DATAFILE="DB/XMLCOUNTER.XML" ;
TRY
{
//MAKE AN INSTANCE OF THE XMLDATADOCUMENT CLASS WHICH READS DATA FROM A
//XML FILE AND STORES IT IN AN DATASET OBJECT
XMLDATADOCUMENT DATADOC = NEW XMLDATADOCUMENT();

//OPEN A FILESTREAM TO THE DATABASE
//"FILESHARE.READWRITE" ENABLES OTHER USER TO ALSO READ AND WRITE TO THE FILE
FILESTREAM FIN ;
FIN = NEW FILESTREAM(SERVER.MAPPATH(DATAFILE), FILEMODE.OPEN, FILEACCESS.READ, FILESHARE.READWRITE) ;
// INFER THE DATASET SCHEMA FROM THE XML DATA AND LOAD THE XML DATA
DATADOC.DATASET.READXML(NEW STREAMREADER(FIN));
//CLOSE THE STREAM
FIN.CLOSE();

//GET THE TOTAL NO OF VIEWERS BY GETTING THE COUNT OF THE NO OF ROWS PRESENT
//IN THE TABLE
SHOWTOTAL.TEXT ="TOTAL VIEWERS :"+ DATADOC.DATASET.TABLES[1].ROWS.COUNT.TOSTRING() ;

//DATABIND THE REPEATER TO THE DATASET OF TABLE '1' IE THE 'VIEWER'
MYDATALIST.DATASOURCE = DATADOC.DATASET.TABLES[1].DEFAULTVIEW;
MYDATALIST.DATABIND();

//FREE THE RESOURCES
DATADOC=NULL ;

}
CATCH (EXCEPTION ED)
{
//IF THERE IS ANY EXCEPTION THEN DISPLAY IT
RESPONSE.WRITE("<FONT COLOR=#FF0000>AN EXCEPTION OCCURED "+ED.TOSTRING()+"</FONT>") ;
}
}
</SCRIPT>
</HEAD>
<BODY >
<H4>WELCOME TO SAURABH'S XML COUNTER VIEWING PAGE.</H4>
<ASP:LABEL ID="SHOWTOTAL" TEXT="" RUNAT="SERVER" />
<BR>

<ASP:REPEATER ID="MYDATALIST" RUNAT="SERVER">
<TEMPLATE NAME="HEADERTEMPLATE">
<H5> VIEWER DETAILS </H5>
</TEMPLATE>
<TEMPLATE NAME="ITEMTEMPLATE">
<BR>
<TABLE CLASS="MAINHEADS" WIDTH="60%" STYLE="FONT: 8PT VERDANA" >
<TR STYLE="BACKGROUND-COLOR:#FFFFCC">
<TD>REFERRER :</TD>
<TD>
<%# DATABINDER.EVAL(CONTAINER.DATAITEM, "REFERRER") %>
</TD></TR>
<TR STYLE="BACKGROUND-COLOR:#FFFFCC">
<TD>USER AGENT :</TD>
<TD>
<%# DATABINDER.EVAL(CONTAINER.DATAITEM, "USERAGENT") %>
</TD></TR>
<TR STYLE="BACKGROUND-COLOR:#FFFFCC">
<TD>USER HOST ADDRESS :</TD>
<TD>
<%# DATABINDER.EVAL(CONTAINER.DATAITEM, "USERHOSTADDRESS") %>
</TD></TR>
<TR STYLE="BACKGROUND-COLOR:#FFFFCC">
<TD>USER HOST NAME :</TD>
<TD>
<%# DATABINDER.EVAL(CONTAINER.DATAITEM, "USERHOSTNAME") %>
</TD></TR>
<TR STYLE="BACKGROUND-COLOR:#FFFFCC">
<TD>BROWSER TYPE :</TD>
<TD>
<%# DATABINDER.EVAL(CONTAINER.DATAITEM, "BROWSERTYPE") %>
</TD></TR>
<TR STYLE="BACKGROUND-COLOR:#FFFFCC">
<TD>BROWSER NAME :</TD>
<TD>
<%# DATABINDER.EVAL(CONTAINER.DATAITEM, "BROWSERNAME") %>
</TD></TR>
<TR STYLE="BACKGROUND-COLOR:#FFFFCC">
<TD>MAJOR VERSION :</TD>
<TD>
<%# DATABINDER.EVAL(CONTAINER.DATAITEM, "MAJORVERSION") %>
</TD></TR>
<TR STYLE="BACKGROUND-COLOR:#FFFFCC">
<TD>MINOR VERSION :</TD>
<TD>
<%# DATABINDER.EVAL(CONTAINER.DATAITEM, "MINORVERSION") %>
</TD></TR>
<TR STYLE="BACKGROUND-COLOR:#FFFFCC">
<TD>PLATFORM :</TD>
<TD>
<%# DATABINDER.EVAL(CONTAINER.DATAITEM, "PLATFORM") %>
</TD></TR>
<TR STYLE="BACKGROUND-COLOR:#FFFFCC">
<TD>DATE :</TD>
<TD>
<%# DATABINDER.EVAL(CONTAINER.DATAITEM, "DATE") %>
</TD></TR>


<TR STYLE="BACKGROUND-COLOR:#FFFFCC">
<TD>TIME :</TD>
<TD>
<%# DATABINDER.EVAL(CONTAINER.DATAITEM, "TIME") %>
</TD>
</TR>
</TABLE><BR>
</TEMPLATE>
</ASP:REPEATER>
</BODY>
</HTML>