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

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

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

=====================进入正题=============================

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

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

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

xml格式:

各个标签的解释:

<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起个名字

2、添加安装程序

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

添加以后的效果。

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

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

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

属性说明:

DelayedAutoStart:设置是否自动启动

Description:服务描述

ServiceName:服务名称

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

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

属性说明:

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

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

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

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

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

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

配置文件设置:

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")) * ; //配置文件中配置的秒数
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 >= && DateTime.Now.Hour <= )
{
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 > && platformnotice[].newsId > )
{
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.NET\Framework\v4.0.30319\installutil.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.NET\Framework\v4.0.30319\installutil.exe /u GameTradingNewsService.exe
GameTradingNewsService.exe 是windows服务项目编译以后bin文件中的exe程序的名称

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

												

使用windows服务更新站点地图的更多相关文章

  1. Dynamics CRM项目实例之七:站点地图修改,联系人-订单-积分管理

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复138或者20141229可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me!        前面文章发表后,不 ...

  2. web站点和windows服务项目发布时如何排除指定文件

    在发布asp.net站点和windows服务项目时,有的时候这样的需求:msbuild编译之后发布到服务器指定目录时要排除指定文件,比如通过jenkins构建时,不希望覆盖原来的Web.config和 ...

  3. Windows 自动更新服务恢复

    之前手贱删除了Windows的自动更新服务,命令: SC DELETE Wuauserv 悲剧的是最近中了[永恒之蓝]病毒,很恼人!杀了毒,最后还是得仰仗Windows的补丁来加固系统.于是想通过SC ...

  4. 使用C#开发windows服务定时发消息到钉钉群_群组简单消息

    前言:本提醒服务,是由C#语言开发的,主要由windows服务项目和winform项目组成,运行服务可实现功能:向钉钉自定义机器人群组里,定时,定次,推送多个自定义消息内容,并实现主要功能的日志记录. ...

  5. 使用Jenkins自动发布Windows服务项目

    不同于发布Web项目,自动发布Windows服务项目需要解决以下几个问题: 如何远程停止和开启服务?需要在发布前停止服务,在发布完成后开启服务. 如何上传编译文件到目标服务器? 问题1:如何远程停止和 ...

  6. 基于SignalR实现B/S系统对windows服务运行状态的监测

    通常来讲一个BS项目肯定不止单独的一个BS应用,可能涉及到很多后台服务来支持BS的运行,特别是针对耗时较长的某些任务来说,Windows服务肯定是必不可少的,我们还需要利用B/S与windows服务进 ...

  7. C# 开发windows服务的一些心得

    最近在做一个windows服务的项目,发现并解决了一些问题,拿出来和大家分享一下,以下windows服务简称“服务” 文章会在适合时间更新,因为朋友们在不断提出新的意见或思路,感谢-.- 1.服务如何 ...

  8. 妙用psexec分析关机一直挂起的Windows update 更新

    Windows 更新服务对每个IT运维人员来说都不会陌生,而且很多情况下出现的一些不兼容,产品问题通过更新都可很好的解决掉. 小弟近日为一台老爷机服务器安装Windows 产品更新就遇到了意见事情,特 ...

  9. RDIFramework.NET框架SOA解决方案(集Windows服务、WinForm形式与IIS形式发布)-分布式应用

    RDIFramework.NET框架SOA解决方案(集Windows服务.WinForm形式与IIS形式发布)-分布式应用 RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架 ...

随机推荐

  1. 实现多表关联来方便你的SELECT查询功能

    这次来学习一下多表关联.比如在数据中创建下面几张表,你可以从主键PRIMARY KEY与外键FOREIGN KEY来看到这几张表它们之间的关系. 场所表[dbo].[SixS_Location]: 主 ...

  2. 优化Angular应用的性能

    MVVM框架的性能,其实就取决于几个因素: 监控的个数 数据变更检测与绑定的方式 索引的性能 数据的大小 数据的结构 我们要优化Angular项目的性能,也需要从这几个方面入手. 1. 减少监控值的个 ...

  3. 关于c++操作符的优先级

    优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级. 所有的优先级中,只有三个优先级是从右至左结合的,它们是单目运算符.条件运算符.赋值运算符.其它的都是从左至右结合. 具有最 ...

  4. for循环的执行顺序

    一边回顾基础一边记录记录做个整理,这篇关于for循环的执行顺序: for(表达式1;表达式2;表达式3) {循环体} 第一步,先对表达式1赋初值; 第二步,判别表达式2是否满足给定条件,若其值为真,满 ...

  5. 【C语言学习趣事】_32_平胸的尴尬,嫁不出去的姑娘

    为什么写这篇文章呢? 为什么要弄这么个题目呢? 首先解释为什么用这个题目.这一切都要从那天在QQ群中的讨论说起,那天在群中,一个哥们问了一个关于(void)0 的问题.然后大家说到了 (void)0和 ...

  6. (学习笔记)HTML的<link>标签

    在HTML中<link>标签用于定义文档与外部资源的关系. <link>标签只存在于head部分. <head> <link rel="styles ...

  7. UVA 11582 Colossal Fibonacci Numbers! 大斐波那契数

    大致题意:输入两个非负整数a,b和正整数n.计算f(a^b)%n.其中f[0]=f[1]=1, f[i+2]=f[i+1]+f[i]. 即计算大斐波那契数再取模. 一开始看到大斐波那契数,就想到了矩阵 ...

  8. linux 下运行多个tomcat

    首先把tomcat解压到linux 文件夹下:如/usr/local下 #vi(gedit) /etc/profile 在其中加入 ##########first tomcat########### ...

  9. 「Unity」与iOS、Android平台的整合:2、导出的Android-Eclipse工程

    谢谢关注~由于博客园的写字有些蛋疼,已经搬迁到简书了 这是本篇文章的最新连接

  10. [Android] 建立与使用Library

    [Android] 建立与使用Library 前言 使用Eclipse开发Android项目时,开发人员可以将可重用的程序代码,封装为Library来提供其他开发人员使用.本篇文章介绍如何将可重用的程 ...