silverlight记录网站访问总人数和在线人数的方式问题

     最近想用silverlight做过网站,在做记录网站访问总人数和在线人数这个小功能时候,不想采用读取数据库,然后再写入数据库的方式,因为觉的只是简单的记录,没必要那么麻烦,于是采取直接读取写入txt记事本的方法,没想到其中碾碾转转,采取几种方式,最终才实现完成,下面我想谈谈自己的完成的整个过程,包括失败的:

     方式一:采取的是在客户端直接读取写入方式。

                     代码如下:StreamResourceInfo text = Application.GetResourceStream(new Uri("txt/河流总集合.txt", UriKind.RelativeOrAbsolute));

                                                         using (StreamReader read = new StreamReader(text.Stream))

                                                                  {

                                                                                  string line = read.ReadLine();

                                                                                  read.Close();

                                                                  }

                                                         using (StreamWriter writer= new StreamWriter(text.Stream))

                                                                  {

                                                                                 writer.WriterLine((Convert.ToInt32(line) + 1).ToString());

                                                                                  read.Close();

                                                                  }

                    这种方式在客户端读取是没问题的,但是在写入writer时候就会抛出异常,说是权限问题,不知道是否有其他的方法在客户端直接写入的?

   方式二:采用独立存储文件方式IsolatedStorageFile

                   代码如下:            ////////////////////////////////读txt
                                                  IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
                                                 Stream stream = new IsolatedStorageFileStream("MyText.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read, isf);
                                                 System.IO.TextReader reader = new System.IO.StreamReader(stream);
                                                 string sLine = reader.ReadLine();
                                                 reader.Close(); // Close the reader
                                                 stream.Close(); // Close the stream
                                                //////////////////////////////////写txt
                                               IsolatedStorageFile isf1 = IsolatedStorageFile.GetUserStoreForApplication();
                                              Stream stream1 = new IsolatedStorageFileStream("MyText.txt", System.IO.FileMode.Create, System.IO.FileAccess.Write, isf1);
                                              System.IO.TextWriter writer = new System.IO.StreamWriter(stream1);
                                             writer.WriteLine((Convert.ToInt32(sLine) + 1).ToString());
                                             writer.Close(); // Close the reader
                                             stream1.Close(); // Close the stream

                  这种方式在单机运行,没发布时候是没有问题的,具体问题见:http://bbs.csdn.net/topics/390304940,到现在我也不明白为什么会这样,以IP形式运行就会出现异常,以localhost形式就没问题,不知道是否也是权限访问问题没?

    方式三:在csdn论坛里,luoSaiMingJavaAndC网友给我指点了,比较麻烦点的方式-WCF,调用发布服务的形式,在此十分感谢luoSaiMingJavaAndC给我的思路,思路如下:现在后台发布好服务,然后在前台调用。

                    后台服务模块:       [WebMethod]
        public string Readtxt(string path)
        {
            string line = "";
            try
            {
                using (StreamReader myreader = new StreamReader("F:/" + path + ".txt"))
                {
                    line = myreader.ReadLine();
                    myreader.Close();
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            return line;
        }
        /// <summary>
        /// 登录时候添加在线人数、总人数 +1
        /// </summary>
        /// <param name="path"></param>
        /// <param name="Readline"></param>
        [WebMethod]
        public void WritetxtAdd(string path, string Readline)
        {
            //string line = "";
            try
            {
                using (StreamWriter mywrite = new StreamWriter("F:/" + path + ".txt"))
                {
                    mywrite.WriteLine((Convert.ToInt32(Readline) + 1).ToString());
                    mywrite.Close(); // Close the reader
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            //return line;
        }
        /// <summary>
        /// 注销时候、退出时候在线人数、总人数-1
        /// </summary>
        /// <param name="path"></param>
        /// <param name="Readline"></param>
        [WebMethod]
        public void WritetxtSub(string path, string Readline)
        {
            //string line = "";
            try
            {
                using (StreamWriter mywrite = new StreamWriter("F:/" + path + ".txt"))
                {
                    if (Convert.ToInt32(Readline) - 1 >= 0)
                    {
                        mywrite.WriteLine((Convert.ToInt32(Readline) - 1).ToString());
                    }
                    else
                    {
                        mywrite.WriteLine("0");
                    }
                    mywrite.Close(); // Close the reader
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            //return line;
        }


客户端调用服务代码:          

            MytxtSoapClient = new Mytxt.MytxtSoapClient();
            MytxtSoapClient.ReadtxtCompleted += new EventHandler<Mytxt.ReadtxtCompletedEventArgs>(MytxtSoapClient_ReadtxtCompleted);
            MytxtSoapClient.ReadtxtAsync("访问总人数");
            MytxtSoapClient1 = new Mytxt.MytxtSoapClient();
            MytxtSoapClient1.ReadtxtCompleted += new EventHandler<Mytxt.ReadtxtCompletedEventArgs>(MytxtSoapClient_ReadtxtCompleted1);
            MytxtSoapClient1.ReadtxtAsync("当前在线人数");

       /// <summary>
        /// 先读访问总人数txt,再访问总人数+1
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MytxtSoapClient_ReadtxtCompleted(object sender, Mytxt.ReadtxtCompletedEventArgs e)
        {
            string readtxt = e.Result.ToString();
            MytxtSoapClient2 = new Mytxt.MytxtSoapClient();
            MytxtSoapClient2.WritetxtAddAsync("访问总人数", readtxt);
           // login = true;
        }
        /// <summary>
        /// 先读当前在线人数txt,再当前在线人数+1
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //bool login = false;
        private void MytxtSoapClient_ReadtxtCompleted1(object sender, Mytxt.ReadtxtCompletedEventArgs e)
        {
            string readtxt = e.Result.ToString();
            MytxtSoapClient3 = new Mytxt.MytxtSoapClient();
            MytxtSoapClient3.WritetxtAddAsync("当前在线人数", readtxt);
            //InitialPage myp = this.Parent as InitialPage;
            //myp.gotopage(new MainPage());
            //login = true;
        }
        /// <summary>
        /// 先读当前在线人数txt,再当前在线人数-1
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MytxtSoapClient_ReadtxtCompleted2(object sender, Mytxt.ReadtxtCompletedEventArgs e)
        {
            string readtxt = e.Result.ToString();
            MytxtSoapClient4 = new Mytxt.MytxtSoapClient();
            MytxtSoapClient4.WritetxtSubAsync("当前在线人数", readtxt);
        }

这种方式也有个问题必须要控制好,那就是同步异步问题,我在实现的过程中就出现一点问题,在登陆页面登陆时候实现了总人数、在线人数均+1,但是跳到主页面时候,却没有同步更新,主页面读取的还是原来的数据,必须要刷新一次才显示新的txt数据。

登陆页面的登陆按钮事件:

        private void Login_click(object sender, RoutedEventArgs e)
        {

            MytxtSoapClient = new Mytxt.MytxtSoapClient();
            MytxtSoapClient.ReadtxtCompleted += new EventHandler<Mytxt.ReadtxtCompletedEventArgs>(MytxtSoapClient_ReadtxtCompleted);
            MytxtSoapClient.ReadtxtAsync("访问总人数");
            MytxtSoapClient1 = new Mytxt.MytxtSoapClient();
            MytxtSoapClient1.ReadtxtCompleted += new EventHandler<Mytxt.ReadtxtCompletedEventArgs>(MytxtSoapClient_ReadtxtCompleted1);
            MytxtSoapClient1.ReadtxtAsync("当前在线人数");
            /////////////////////////////////////
                InitialPage myp = this.Parent as InitialPage;
                myp.gotopage(new MainPage());

        }

      这里我以为是按代码的顺便来的,顺着我的思路,先读取txt再写入+1,之后才跳转到主页面MainPage的,结果断点跟踪时候发现不是。

主页面读取:

        public MainPage()

{

            MytxtSoapClient = new Mytxt.MytxtSoapClient();
            MytxtSoapClient.ReadtxtCompleted += new EventHandler<Mytxt.ReadtxtCompletedEventArgs>(MytxtSoapClient_ReadtxtCompletedOnlyread);
            MytxtSoapClient.ReadtxtAsync("访问总人数");
            MytxtSoapClient1 = new Mytxt.MytxtSoapClient();
            MytxtSoapClient1.ReadtxtCompleted += new EventHandler<Mytxt.ReadtxtCompletedEventArgs>(MytxtSoapClient_ReadtxtCompleted1onlyread);
            MytxtSoapClient1.ReadtxtAsync("当前在线人数");

}

到这里可能是同步问题所导致的,luoSaiMingJavaAndC又给我指点了linq  to  rx 思路,说是 对异步控制很好,让我尝试一下!对于linq这种方式我不是很熟悉,我是菜鸟来的,以前读取数据库都是那种方式:先连接数据库再读取数据、操作数据,最后再关闭的,很古老的方式,对于这种linq绑定数据库控件方式了解不多。听取luoSaiMingJavaAndC意见,我去学习了解linq方式,最后终于解决了这个问题,十分感谢luoSaiMingJavaAndC对我的帮助,衷心的感谢!


      备注:

      GIS技术交流QQ群:432512093

      GIS论坛:http://arcgis.c.ev123.com/vip_arcgis.html



你可能感兴趣的:(silverlight记录网站访问总人数和在线人数的方式问题)