手机
当前位置:查字典教程网 >编程开发 >C#教程 >c#使用windows服务更新站点地图的详细示例
c#使用windows服务更新站点地图的详细示例
摘要:由于公司平台访问人数逐渐增多,公司项目的数据库已经几次出现宕机现象。为减轻数据库压力,我上个月对公司项目做了下调整。把新闻板块提取出来单独一...

由于公司平台访问人数逐渐增多,公司项目的数据库已经几次出现宕机现象。为减轻数据库压力,我上个月对公司项目做了下调整。把新闻板块提取出来单独一个站点,单独一个数据库。减少了主站点和数据库的负担和压力。

但放在线上一个月,新闻新的发布数量最少已经有500篇左右。百度只收录了70个左右,于是想到可能是没有站点地图造成的。但怎么定时更新站点地图呢?

我尝试使用windows服务来定时更新站点地图。

首先需要了解下几个问题。

1、百度收录的站点地图(sitemap)的格式。详情请查看该链接:查看

目前我只用到了xml格式的站点地图,就讲下xml格式的站点地图。

xml格式:

c#使用windows服务更新站点地图的详细示例1

各个标签的解释:

<loc>www.example1.com</loc>该页的网址。该值必须少于256个字节(必填项)。格式为<loc>您的url地址</loc>

<lastmod>2010-01-01</lastmod>该文件上次修改的日期(选填项)。格式为<lastmod>年-月-日</lastmod>

<changefreq>always</changefreq>页面可能发生更改的频率(选填项)。

有效值为:always、hourly、daily、weekly、monthly、yearly、never

<priority>1.0</priority>此网页的优先级。有效值范围从0.0到1.0(选填项)。0.0优先级最低、1.0最高。

2、站点地图更新的频率问题

由于公司新闻更新一般时间固定在9:30-18:00。每天大概发布10——50篇新闻,所以我设想更新站点地图的时间在:9:00——19:00,每3个小时更新一次,其他时间不做任何操作,降低数据库查询的负担。

开始写windows 服务。

1、新建windows服务,给windows起个名字

c#使用windows服务更新站点地图的详细示例2

2、添加安装程序

双击Service1.cs进入视图界面,右键,选择“添加安装程序”

c#使用windows服务更新站点地图的详细示例3

添加以后的效果。

c#使用windows服务更新站点地图的详细示例4

serviceInstaller1:服务安装组件。(主要用于设置 服务名称、服务描述、服务是否开机启动或延迟启动、服务启动方式等)

serviceProcessInstaller1:服务进程安装组件(主要用户设置运行服务的账户类型,如:User、LocalService、NetworkService、LocalSystem等)

serviceInstaller1的属性设置(快捷键F4):

c#使用windows服务更新站点地图的详细示例5

属性说明:

DelayedAutoStart:设置是否自动启动

Description:服务描述

ServiceName:服务名称

StartType:启动类型。有三种:Manual(启动)、Automatic(自动)、Disabled(不启动)

serviceProcessInstaller1属性设置(快捷键F4):

c#使用windows服务更新站点地图的详细示例6

属性说明:

Account:运行服务的账户类型。有四种:User、LocalService、NetworkService、LocalSystem。

我选择的是LocalSystem,意思是:当前系统都能运行。

3、定时触发问题的一些需要注意的误区。

定时触发,大家肯定想到的是Timer组件,但一定要记住。windows服务下是没有Timer控件的。。。。这里看到的Timer组件是不会定时触发的,需要自己实现Timer定时触发的事件,本人曾在此坑深陷多时。。。。

c#使用windows服务更新站点地图的详细示例7

由于本人为了实现定时触发的事件可控性和可修改性。增加了一个配置文件。配置文件添加方式如图:

windows服务项目——右键——添加——新建项

c#使用windows服务更新站点地图的详细示例8

配置文件设置:

c#使用windows服务更新站点地图的详细示例9

4、定时windows服务代码:

复制代码 代码如下:

public partial class NPcgoNewsService : ServiceBase

{

Timer aTimer = new Timer(); //System.Timers,不是form的

public NPcgoNewsService()

{

InitializeComponent();

}

protected override void OnStart(string[] args)

{

//一个一直重写sitemap的服务

aTimer.Elapsed += new ElapsedEventHandler(aTimer_Tick);

aTimer.Enabled = true;

aTimer.Interval = int.Parse(PublicMethods.GetAppSettings("NewsSiteUpdateTime")) * 1000; //配置文件中配置的秒数

aTimer.Start();

}

protected override void OnStop()

{

this.aTimer.Enabled = false;

this.aTimer.Stop();

}

/// <summary>

/// timer定时触发

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void aTimer_Tick(object sender, ElapsedEventArgs e)

{

//调用该服务的时间为上午9点——下午18点,其他时间不调用

if (DateTime.Now.Hour >= 9 && DateTime.Now.Hour <= 19)

{

MakeSiteMap make = new MakeSiteMap();

make.GetBaiDuSiteMap();

}

}

}

生成百度地图的方法(GetBaiDuSiteMap):

复制代码 代码如下:

/// <summary>

/// 生成百度站点地图

/// </summary>

/// <returns></returns>

public void GetBaiDuSiteMap()

{

XmlDocument xmlDoc = new XmlDocument();

//获取新闻站点地图的本地保存路径

string path = Path.Combine(PublicMethods.GetAppSettings("NewsSiteMapPath"));

xmlDoc.Load(path);

//查找根节点

XmlNode root = xmlDoc.SelectSingleNode("urlset");

//删除以前的所有老节点

root.RemoveAll();

#region 平台公告

//查询最新100条平台公告

List<IT_NEWS> platformnotice = GetPlatformNotice();

if (platformnotice != null && platformnotice.Count > 0 && platformnotice[0].newsId > 0)

{

foreach (IT_NEWS platformNoticeNews in platformnotice)

{

XmlElement xesub1 = xmlDoc.CreateElement("url");

XmlElement xe1 = xmlDoc.CreateElement("loc");

xe1.InnerText = "http://news.npcgo.com" + "/notice-" + platformNoticeNews.newsType + "-" + platformNoticeNews.newsId + ".html";

XmlElement xe2 = xmlDoc.CreateElement("lastmod");

xe2.InnerText = Convert.ToDateTime(platformNoticeNews.newsCreateTime).ToString("yyyy-MM-dd");

XmlElement xe3 = xmlDoc.CreateElement("changefreq");

xe3.InnerText = "daily";

XmlElement xe4 = xmlDoc.CreateElement("priority");

xe4.InnerText = "0.2";

xesub1.AppendChild(xe1);

xesub1.AppendChild(xe2);

xesub1.AppendChild(xe3);

xesub1.AppendChild(xe4);

root.AppendChild(xesub1);

}

}

#endregion

xmlDoc.AppendChild(root);

xmlDoc.Save(path);

}

安装windows服务:

需要写一个windows服务安装的批处理和卸载的批处理,都放在windows服务项目的bin/Debug文件夹下。

安装服务,install.bat代码:

复制代码 代码如下:

%SystemRoot%Microsoft.NETFrameworkv4.0.30319installutil.exe GameTradingNewsService.exe

Net Start NPCgoNewsServices

sc config NPCgoNewsServices start= auto

解释:

GameTradingNewsService.exe 是windows服务项目编译以后bin文件中的exe程序的名称。

Net Start xxx 是开启xxx服务

NPCgoNewsServices 是windows服务名称(即:serviceInstaller1属性面板设置的服务名称(serviceName属性))

sc config NPCgoNewsServices start= auto 是设置windows服务启动方式为自动

卸载服务 unstall.bat代码:

复制代码 代码如下:

%SystemRoot%Microsoft.NETFrameworkv4.0.30319installutil.exe /u GameTradingNewsService.exe

GameTradingNewsService.exe 是windows服务项目编译以后bin文件中的exe程序的名称

至此,一个服务是彻底完成。

【c#使用windows服务更新站点地图的详细示例】相关文章:

c#使用linq技术创建xml文件的小例子

c#中抽象类和接口的详细介绍

C#操作IIS程序池及站点的创建配置实现代码

C#启动windows服务方法的相关问题分析

C#编写Windows服务实例代码

C#生成随机字符串的实例

C#中方法的详细介绍

.net使用Aspose.Words进行Word替换操作的实现代码

用C#写的ADSL拨号程序的代码示例

c# 生成随机时间的小例子

精品推荐
分类导航