波仔

信息蕴藏价值
随笔 - 59, 评论 - 433, 引用 - 5

导航

关于

    I am building a portal named Starlight which are based on the Teamwork Portal(a portal I have finished, because of the name has been registered by another company I have changed the name) and DynamiceWeb.
    You can get the latest information about it here.


每月存档

最新留言

  • re:BI数据级权限解决方案
    <p>hi,你好。这个BI数据权限,很有新意。有个细节问题,想向你请教,</p> <div>StrtoSet(BI.DataSecurity.GetDimensio...
    by shenzhenjia(注册) on 2009/6/14 17:09:43
  • re:BI数据级权限解决方案
    <p>hi,你好。这个BI数据权限,很有新意。有个细节问题,想向你请教,</p> <div>StrtoSet(BI.DataSecurity.GetDimensio...
    by shenzhenjia(注册) on 2009/6/14 17:09:17
  • re: BI数据级权限解决方案
    不错,另外字符串相加建议采用StringBuilder做处理。
    by kentliu(匿名) on 2008/8/18 9:44:31
  • re: 发布一个博客软件系统——肥猫博客
    谢谢.fmblog还在不断完善中,你说的很多确实是我们需要改进的。
    by jasper(匿名) on 2008/4/24 14:38:01
  • 日啊,你这个是asp.net版么?
    你有试验过么?就在这里乱讲,你这样绝对会碰到权限cdo.message问题,最恶心的这种沽名钓誉的
    by passer(匿名) on 2007/12/10 10:07:00
  • 回复: I have a dream
    I think my dream is very simple .I just want find a good job .by the end of the fouth college year.
    by kally(匿名) on 2007/11/14 21:56:00
  • 回复: I have a dream
    I have a dream that one day every people can live on the earth with out WAR
    by w4er(匿名) on 2007/11/3 13:53:00
  • 回复: I have a dream
    no thing is diffcult
    by w4er(匿名) on 2007/11/3 13:47:00
  • 回复: 发布一个博客软件系统——肥猫博客
    肥猫博客的确是个很不错博客软件系统,但很遗憾目前还不是很适合使用,我有用过你的博客,后台操作感一流,功能的确很好,但性能不是很稳定,网站皮肤只有一个,博客皮肤稍放点大的东西上去会扭曲整个页面,看起不不...
    by 赶路人(匿名) on 2007/10/22 10:27:00
  • 回复: 比DotNetNuke更好的Portal
    有谁用过 lightPortal 吗?一个功能强大的java 开源 portal
    by jacky(匿名) on 2007/9/21 9:10:00
  • 回复: ASP.NET发送邮件
    有ASP版的吗?
    by 开心网(匿名) on 2007/8/23 16:11:00
  • 回复: ASP.NET发送邮件
    有ASP版的吗? 有的话不错
    by 开心网(匿名) on 2007/8/23 16:11:00

  • 我 <br>地联 系电话好像是13651765786,号179447907
    by 王竟华(匿名) on 2007/8/8 15:19:00
  • 回复: I have a dream
    i have a dream <br>that is i will happiness all my life
    by Joy(匿名) on 2007/6/28 17:58:00
  • 回复: I have a dream
    I have a dream that i can do anything.
    by aaronnorman(匿名) on 2007/6/17 11:09:00

广告

说说“RSS博客镜像”

RSS博客镜像是CommunityServer在较高级版本中(好像是从2.1开始)推出的功能,其主要的作用是,将其它博客(博客软件或者博客服务提供商)中的日志通过解析RSS方式自动发布到CommunityServer中。

这是一个相当实用的功能,有了RSS博客镜像,就不需要在多处同时发布博客日志了。比如你同时在新浪上有自己的博客,又同时有自己的个人博客站点,那么你只需要在新浪上发布博客日志,而个人博客站点通过RSS博客镜像功能将新浪博客上发布的新日志自动更新到站点中。

我们在肥猫博客中,也提供了这样的一个功能,在这里就此介绍下实现方法,这个实现方式是针对ASP.NET的,至于asp,由于其天生的局限性,可能无法直接在Web应用程序中完成这一功能,而需要额外的Windows应用程序的支持。

1. 管理RSS博客镜像

首先我们需要在肥猫博客软件系统中管理好RSS博客镜像,需要管理的内容有:

l         RSS地址

l         更新频率

l         最后更新的时间

需要管理的内容如图所示,这里所列出的3个是必须的字段,当然根据你自己系统的需要,你可能需要更多的字段。

这部分工作由于和肥猫博客系统相关性比较强,如果你需要自己实现RSS博客镜像,和你本身的系统也是比较相关的,这里就不再多做介绍,你根据自己系统的需要去实现就行。

2. 通过ASP.NET的定时器来抓取RSS

有了上面的对每个RSS种子定时更新的信息,就需要在ASP.NET中设置一个定时器来定时更新这些RSS种子内容了。

这部分内容请主要参考如下文章《在 ASP.NET 中使用计时器(Timer)》,根据这篇文章实现定时器就足够了。下面我主要介绍下在肥猫博客中的实现方式:

这下面的代码都在Global.ascx.cs中实现。

        protected void Application_Start(Object sender, EventArgs e)

        {

   

            SetApplicationStatus(RssMirror, true);

 

            // 设置定时器

            System.Timers.Timer timer = new System.Timers.Timer();

 

            timer.Elapsed += new System.Timers.ElapsedEventHandler(this.RefressRssMirror);

           

            timer.Interval = 300000;  // 5分钟中触发定时器

            timer.AutoReset = true;

           

            timer.Enabled = true;

 

        }

 

        private void SetApplicationStatus(string keyword, object result)

        {

            Application.Lock();

            Application[keyword] = result;

            Application.UnLock();

        }

 

        private void UpdateRssMirror(fmRssMirror item, fmblog.Data.DataProviders.DataProvider provider)

        {

            try

            {

                DateTime now = DateTime.Now;

 

                XmlDocument doc = new XmlDocument();

 

                // 载入RSS种子

                doc.Load(item.FeedUrl);

 

                // 解析RSS种子内容

                fmPostCollection list = fmFeedParser.GetPosts(item.UserName, doc, item.LastUpdateTime);

 

                for(int i=list.Count-1; i>=0; i--)

                {

                    // 根据标题,判断博客日志是否已经存在

                    if(provider.GetPost(item.UserName, list[i].Title)==null)

                    {

                        provider.NewPost(list[i], string.Empty);

                    }

                }

 

                // 设置最后更新时间

                provider.SetRssMirrorLastUpdateTime(item.Id, now, item.UserName);

            }

            catch(Exception)

            {

            }

        }

 

        protected void RefressRssMirror(object sender, System.Timers.ElapsedEventArgs e)

        {

            // 判断上次触发的定时器是否已经完成

            if((bool)Application[RssMirror])

            {

                SetApplicationStatus(RssMirror, false);

 

                try

                {

                    fmblog.Data.DataProviders.DataProvider provider = fmblog.Data.DataProviders.DataProvider.CreateInstance(Application);

 

                    provider.OpenConnection();

 

                    try

                    {

                        fmRssMirrorCollection list = provider.GetAllRssMirrors();

 

                        DateTime now = DateTime.Now;

                        // 更新RSS博客镜像里的所有RSS种子

                        foreach(fmRssMirror item in list)

                        {

                            TimeSpan span = now - item.LastUpdateTime;

 

                            if(span.Hours>=item.UpdateInterval)

                            {

                                UpdateRssMirror(item, provider);

                            }

                        }

                    }

                    catch(Exception)

                    {

                    }

               

                    provider.CloseConnection();

                }

                catch(Exception)

                {

                }

 

                SetApplicationStatus(RssMirror, true);

            }

        }

       这段代码主要是在Application_Start函数中创建一个5分钟的定时器,定时器的作用就是载入所有的RSS博客镜像种子,然后将新内容更新到系统中。

3. 如何支持多协议(RSSATOMRDF等),支持协议的多种版本

在实现RSS博客镜像时,我们不得不面对一个问题,就是多种协议的支持,并且对每个协议可能还有版本的区别;这样就导致我们必须进行多协议,多版本的支持。

为了解决这个问题,我们必须研究好RSSATOMRDF协议,及他们的多种版本,比如RSS1.02.0等等。

我们在研究中发现,一些字段有在协议中有多种表达方式,不如内容这个字段,可能存在"content:encoded", "description", "dc:description"等等XML表达方式,并且他们还有优先级的区别。

很多的RSS种子,在content:encoded中记录全文,而在description中记录摘要。因此,我们设置了如下的函数来统一处理这个问题,大大的方便了兼容性。

        public static string GetNodeData(XmlNode node, params string[] argv)

        {

            foreach(string arg in argv)

            {

                foreach(XmlNode subnode in node.ChildNodes)

                {

                    if(subnode.Name == arg)

                    {

                        return subnode.InnerText;

                    }

                }

            }

 

            return string.Empty;

        }

这个函数会接收一串XML标签记号,然后在父结点中按照优先级别来读取值。其调用方式如下:

post.Content=GetNodeData(node,"content:encoded","description","dc:description");

post.PublishTime = GetTime(GetNodeData(node, "pubDate", "dc:date"));

这个函数是我们解决多版本的一个办法。因为大部分版本其主体结构都差不多,只是有些XML标签记号的区别(各种博客系统在记号处理上也存在少许差别)。

至于各种协议,你按照标准协议来写代码解析就可以了,这里不再作阐述。可能存在的一个问题就是,需要测试多种RSS种子才能够知道RSS博客镜像功能的兼容性,因为很多种子的处理方式都不同。

4. ACCESS数据库会遇到的小问题

在处理ACCESS数据库的时候,我们遇到了一个小问题,那就是定时器触发的函数中HttpContext.Current为空,这让我们无法通过MapPath方法取得ACCESS数据库的绝对路径。

为了解决这个问题,我们采用了一点投机取巧的方法,那就是将这个绝对路径记录在Application的全局变量中。这个记录动作在第一次访问肥猫博客后发生(因为第一次访问肥猫博客,就会读取数据库,而IE的访问HttpContext.Current是有值的),因此为了启动RSS博客镜像,需要进行一次浏览器的访问。

这个问题我们调试了大半天才搞定,如果你用的也是ACCESS数据库,希望这个解决办法对你也有用处。

如果你是SQL Server数据库,就不会存在这个问题。

基本上,有了以上几个内容,你就可以实现自己的RSS博客镜像功能了。

posted on 2007-02-26 11:49:00 by jasper  评论(5) 阅读(6758)

Powered by: Joycode.MVC引擎 0.5.2.0