c#使用windows服務(wù)更新站點(diǎn)地圖的詳細(xì)示例
由于公司平臺(tái)訪問(wèn)人數(shù)逐漸增多,公司項(xiàng)目的數(shù)據(jù)庫(kù)已經(jīng)幾次出現(xiàn)宕機(jī)現(xiàn)象。為減輕數(shù)據(jù)庫(kù)壓力,我上個(gè)月對(duì)公司項(xiàng)目做了下調(diào)整。把新聞板塊提取出來(lái)單獨(dú)一個(gè)站點(diǎn),單獨(dú)一個(gè)數(shù)據(jù)庫(kù)。減少了主站點(diǎn)和數(shù)據(jù)庫(kù)的負(fù)擔(dān)和壓力。
但放在線上一個(gè)月,新聞新的發(fā)布數(shù)量最少已經(jīng)有500篇左右。百度只收錄了70個(gè)左右,于是想到可能是沒(méi)有站點(diǎn)地圖造成的。但怎么定時(shí)更新站點(diǎn)地圖呢?
我嘗試使用windows服務(wù)來(lái)定時(shí)更新站點(diǎn)地圖。
首先需要了解下幾個(gè)問(wèn)題。
1、百度收錄的站點(diǎn)地圖(sitemap)的格式。詳情請(qǐng)查看該鏈接:查看
目前我只用到了xml格式的站點(diǎn)地圖,就講下xml格式的站點(diǎn)地圖。
xml格式:
各個(gè)標(biāo)簽的解釋:
<loc>www.example1.com</loc>該頁(yè)的網(wǎng)址。該值必須少于256個(gè)字節(jié)(必填項(xiàng))。格式為<loc>您的url地址</loc>
<lastmod>2010-01-01</lastmod>該文件上次修改的日期(選填項(xiàng))。格式為<lastmod>年-月-日</lastmod>
<changefreq> always </ changefreq >頁(yè)面可能發(fā)生更改的頻率(選填項(xiàng)) 。
有效值為:always、hourly、daily、weekly、monthly、yearly、never
<priority>1.0</priority >此網(wǎng)頁(yè)的優(yōu)先級(jí)。有效值范圍從 0.0 到 1.0 (選填項(xiàng)) 。0.0優(yōu)先級(jí)最低、1.0最高。
2、站點(diǎn)地圖更新的頻率問(wèn)題
由于公司新聞更新一般時(shí)間固定在9:30-18:00。每天大概發(fā)布10——50篇新聞,所以我設(shè)想更新站點(diǎn)地圖的時(shí)間在:9:00——19:00,每3個(gè)小時(shí)更新一次,其他時(shí)間不做任何操作,降低數(shù)據(jù)庫(kù)查詢的負(fù)擔(dān)。
開始寫windows 服務(wù)。
1、新建windows服務(wù),給windows起個(gè)名字
2、添加安裝程序
雙擊Service1.cs進(jìn)入視圖界面,右鍵,選擇“添加安裝程序”
添加以后的效果。
serviceInstaller1:服務(wù)安裝組件。(主要用于設(shè)置 服務(wù)名稱、服務(wù)描述、服務(wù)是否開機(jī)啟動(dòng)或延遲啟動(dòng)、服務(wù)啟動(dòng)方式等)
serviceProcessInstaller1:服務(wù)進(jìn)程安裝組件(主要用戶設(shè)置運(yùn)行服務(wù)的賬戶類型,如:User、LocalService、NetworkService、LocalSystem等)
serviceInstaller1的屬性設(shè)置(快捷鍵F4):
屬性說(shuō)明:
DelayedAutoStart:設(shè)置是否自動(dòng)啟動(dòng)
Description:服務(wù)描述
ServiceName:服務(wù)名稱
StartType:啟動(dòng)類型。有三種:Manual(啟動(dòng))、Automatic(自動(dòng))、Disabled(不啟動(dòng))
serviceProcessInstaller1屬性設(shè)置(快捷鍵F4):
屬性說(shuō)明:
Account:運(yùn)行服務(wù)的賬戶類型。有四種:User、LocalService、NetworkService、LocalSystem。
我選擇的是LocalSystem,意思是:當(dāng)前系統(tǒng)都能運(yùn)行。
3、定時(shí)觸發(fā)問(wèn)題的一些需要注意的誤區(qū)。
定時(shí)觸發(fā),大家肯定想到的是Timer組件,但一定要記住。windows服務(wù)下是沒(méi)有Timer控件的。。。。這里看到的Timer組件是不會(huì)定時(shí)觸發(fā)的,需要自己實(shí)現(xiàn)Timer定時(shí)觸發(fā)的事件,本人曾在此坑深陷多時(shí)。。。。
由于本人為了實(shí)現(xiàn)定時(shí)觸發(fā)的事件可控性和可修改性。增加了一個(gè)配置文件。配置文件添加方式如圖:
windows服務(wù)項(xiàng)目——右鍵——添加——新建項(xiàng)
配置文件設(shè)置:
4、定時(shí)windows服務(wù)代碼:
public partial class NPcgoNewsService : ServiceBase
{
Timer aTimer = new Timer(); //System.Timers,不是form的
public NPcgoNewsService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
//一個(gè)一直重寫sitemap的服務(wù)
aTimer.Elapsed += new ElapsedEventHandler(aTimer_Tick);
aTimer.Enabled = true;
aTimer.Interval = int.Parse(PublicMethods.GetAppSettings("NewsSiteUpdateTime")) * 1000; //配置文件中配置的秒數(shù)
aTimer.Start();
}
protected override void OnStop()
{
this.aTimer.Enabled = false;
this.aTimer.Stop();
}
/// <summary>
/// timer定時(shí)觸發(fā)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void aTimer_Tick(object sender, ElapsedEventArgs e)
{
//調(diào)用該服務(wù)的時(shí)間為上午9點(diǎn)——下午18點(diǎn),其他時(shí)間不調(diào)用
if (DateTime.Now.Hour >= 9 && DateTime.Now.Hour <= 19)
{
MakeSiteMap make = new MakeSiteMap();
make.GetBaiDuSiteMap();
}
}
}
生成百度地圖的方法(GetBaiDuSiteMap):
/// <summary>
/// 生成百度站點(diǎn)地圖
/// </summary>
/// <returns></returns>
public void GetBaiDuSiteMap()
{
XmlDocument xmlDoc = new XmlDocument();
//獲取新聞?wù)军c(diǎn)地圖的本地保存路徑
string path = Path.Combine(PublicMethods.GetAppSettings("NewsSiteMapPath"));
xmlDoc.Load(path);
//查找根節(jié)點(diǎn)
XmlNode root = xmlDoc.SelectSingleNode("urlset");
//刪除以前的所有老節(jié)點(diǎn)
root.RemoveAll();
#region 平臺(tái)公告
//查詢最新100條平臺(tái)公告
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服務(wù):
需要寫一個(gè)windows服務(wù)安裝的批處理和卸載的批處理,都放在windows服務(wù)項(xiàng)目的bin/Debug文件夾下。
安裝服務(wù),install.bat代碼:
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe GameTradingNewsService.exe
Net Start NPCgoNewsServices
sc config NPCgoNewsServices start= auto
解釋:
GameTradingNewsService.exe 是windows服務(wù)項(xiàng)目編譯以后bin文件中的exe程序的名稱。
Net Start xxx 是開啟xxx服務(wù)
NPCgoNewsServices 是windows服務(wù)名稱(即:serviceInstaller1屬性面板設(shè)置的服務(wù)名稱(serviceName屬性))
sc config NPCgoNewsServices start= auto 是設(shè)置windows服務(wù)啟動(dòng)方式為自動(dòng)
卸載服務(wù) unstall.bat代碼:
%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\installutil.exe /u GameTradingNewsService.exe
GameTradingNewsService.exe 是windows服務(wù)項(xiàng)目編譯以后bin文件中的exe程序的名稱
至此,一個(gè)服務(wù)是徹底完成。
- C#基于Windows服務(wù)的聊天程序(1)
- 使用C#創(chuàng)建Windows服務(wù)的實(shí)例代碼
- C#使用windows服務(wù)發(fā)送郵件
- C#添加Windows服務(wù) 定時(shí)任務(wù)
- C#版Windows服務(wù)安裝卸載小工具
- C#通過(guò)創(chuàng)建Windows服務(wù)啟動(dòng)程序的方法詳解
- C#使用windows服務(wù)開啟應(yīng)用程序的方法
- 基于C#實(shí)現(xiàn)Windows服務(wù)狀態(tài)啟動(dòng)和停止服務(wù)的方法
- c#創(chuàng)建windows服務(wù)入門教程實(shí)例
- c# 在windows服務(wù)中 使用定時(shí)器實(shí)例代碼
- c#創(chuàng)建windows服務(wù)(Windows Services)詳細(xì)步驟
- C#開發(fā)Windows服務(wù)實(shí)例之實(shí)現(xiàn)禁止QQ運(yùn)行
- C#編寫Windows服務(wù)實(shí)例代碼
- C#啟動(dòng)和停止windows服務(wù)的實(shí)例代碼
- C#啟動(dòng)windows服務(wù)方法的相關(guān)問(wèn)題分析
- c#開發(fā)的程序安裝時(shí)動(dòng)態(tài)指定windows服務(wù)名稱
- C#編寫Windows服務(wù)程序詳細(xì)步驟詳解(圖文)
相關(guān)文章
c#實(shí)現(xiàn)無(wú)標(biāo)題欄窗口的拖動(dòng)
本篇文章是對(duì)c#中實(shí)現(xiàn)無(wú)標(biāo)題欄窗口拖動(dòng)的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06WPF實(shí)現(xiàn)環(huán)(圓)形菜單的示例代碼
這篇文章主要介紹了如何利用WPF繪制一個(gè)簡(jiǎn)單的環(huán)形菜單,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下2022-07-07舊項(xiàng)目升級(jí)新版Unity2021導(dǎo)致Visual?Studio無(wú)法使用的問(wèn)題
在項(xiàng)目開發(fā)過(guò)程中,不可避免的會(huì)升級(jí)開發(fā)工具。這次我在舊項(xiàng)目版本升級(jí)到新版Unity2021.2.x時(shí),出現(xiàn)Visual?Studio無(wú)法定位等問(wèn)題,這里我給大家分享下解決方法,舊項(xiàng)目升級(jí)新版Unity2021導(dǎo)致Visual?Studio無(wú)法使用的問(wèn)題,需要的朋友可以參考下2021-12-12windows下C#定時(shí)管理器框架Task.MainForm詳解
這篇文章主要為大家詳細(xì)介紹了windows下C#定時(shí)管理器框架Task.MainForm的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06C#中使用快速排序按文件創(chuàng)建時(shí)間將文件排序的源碼
C#中使用快速排序按文件創(chuàng)建時(shí)間將文件排序的源碼...2007-03-03WCF如何使用動(dòng)態(tài)代理精簡(jiǎn)代碼架構(gòu)
這篇文章主要介紹了WCF如何使用動(dòng)態(tài)代理精簡(jiǎn)代碼架構(gòu),幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03