欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

基于C# 网站地图制作

程序员文章站 2024-03-09 17:09:53
1、 我们的网站是用c#开发的,我们采用数据库存储所有文章信息。所以我们的文章都是动态地从数据库中提取出来的。这点很不利于蜘蛛的顺藤摸瓜。 2、 这点嘛,嘿嘿,就有些勉强了...
1、 我们的网站是用c#开发的,我们采用数据库存储所有文章信息。所以我们的文章都是动态地从数据库中提取出来的。这点很不利于蜘蛛的顺藤摸瓜。
2、 这点嘛,嘿嘿,就有些勉强了。做个网站地图,可以让用户对敝网站的内容一目了然,能起到很好的导航作用。
鉴于上述原因,于是乎,俺就决定为俺地“赤兔英语网”做一个网站地图。由于google等搜索引擎所需的网站地图必须是xml文件,所以俺决定做网页形式和xml形式两种网站地图。我们的网站是用c#开发的,当然是使用c#语言来编写俺地网站地图了,赫赫。
首先,我们来看看,我们的网站地图该怎么生成,怎么展现。简单思考之后,我决定这样做。网站首页的菜单中添加“网站地图”选项,其链接着网页形式的网站地图,页面名字为sitemap.html;首页的底部也添加链接“网站地图”,其链接着xml格式的网站地图,页面名字为sitemap.xml。这两个页面生成程序在后台添加。设置一个按钮,管理员在一段时间内点击该按钮,直接生成这两个文件,放在网站的根目录下,供客户端随时调用。
下面,我们来看看生成网站地图的代码的具体实现。为了文章可读性,我们从顶向下来对code实现过程做以介绍。
一、网站地图的顶层设计
顶层的网站地图生成按钮的code为:
protected void btngeneratesitemap_click(object sender, eventargs e)
{
createhtmlsitemap();
createxmlsitemap();
webutility.responsescript("网站地图生成完毕!",0);
}
上面code一目了然,createhtmlsitemap()用来生成html网站地图,createxmlsitemap()用来生成xml网站地图。
二、html网站地图的生成
我们先介绍html网站地图的生成。createhtmlsitemap()的code如下:
public void createhtmlsitemap()
{
fileinfo htmlfile = null;
streamwriter writehtmlfile = null;
string filepath = server.mappath("sitemap.html");//获取html文件路径及名称
htmlfile = new fileinfo(filepath);//创建html文件
writehtmlfile = htmlfile.createtext();
writehtmlfile.writeline("<html>");
writehtmlfile.writeline("<head>");
writehtmlfile.writeline("<meta http-equiv=content-type content=text/html;charset=utf-8>");
writehtmlfile.writeline("<title>赤兔英语网 网站地图</title>");
writehtmlfile.writeline("</head>");
writehtmlfile.writeline("<body>");
gethtmlsitemapdata(writehtmlfile);
writehtmlfile.writeline("</body>");
writehtmlfile.writeline("</html>");
writehtmlfile.close();
}
上述code创建了html文件sitemap.html,并使用对象streamwriter书写了sitemap.html。函数gethtmlsitemapdata(writehtmlfile)完成了sitemap.html正文部分的组织。
需要注意的是,如果网站地图中有中文,必须将charset设置为utf-8。否则中文不能正常显示。
public void gethtmlsitemapdata(streamwriter writerfile)
{
string classtablename = "articleclass";
string articleitemtablename = "articleitem";
string connectionstring = configurationmanager.appsettings["sqlconnstring"].tostring();
sqlconnection conn = new sqlconnection(connectionstring);
if (conn.state == connectionstate.closed)
{
conn.open();
}
//查询大类信息
sqldataadapter classdataadpt = new sqldataadapter("select id, classname from " + classtablename, connectionstring);
dataset classdataset = new dataset();
classdataadpt.fill(classdataset, classtablename);
writerfile.writeline("<table border='1' width='1000px'cellspacing='0' cellpadding='0'>");
//按照大类信息来查取各个大类下的文章信息
for (int i = 0; i < classdataset.tables[0].rows.count; i++)
{
string tempsql = "select id, articletitle, parentid from " + articleitemtablename + " where parentid = " + classdataset.tables[0].rows[i][0].tostring();
sqlcommand cmd = new sqlcommand(tempsql, conn);
if (conn.state == connectionstate.closed)
{
conn.open();
}
sqldatareader rdr = cmd.executereader(commandbehavior.closeconnection);
if (rdr.hasrows)
{
int classid = 0;
int rownum = 0;//记录处理了篇文章信息
int memberinline = 5;//每行显示多少篇文章的链接信息
while (rdr.read())
{
//处理大类信息,大类也需要以超链接的方式写入html文件
if (classid != int.parse(rdr[2].tostring()))
{
rownum = 0;
classid = int.parse(rdr[2].tostring());
writerfile.writeline("<tr>");
writerfile.writeline("<td colspan='5'>");
writerfile.writeline("<a style='font-size:15px;font-weight:bold;' target='_blank' href='http://www.chituwang.com/article/index.aspx?parentid=" + classdataset.tables[0].rows[i][0].tostring() + "'>" + classdataset.tables[0].rows[i][1].tostring() + "</a>");
writerfile.writeline("</td>");
writerfile.writeline("</tr>");
}
//处理文章信息
rownum++;
if (1 == (rownum % memberinline))//a new line
{
writerfile.writeline("<tr>");
}
writerfile.writeline("<td style='width:200px'>");
writerfile.writeline("<a target='_blank' href='http://www.chituwang.com/article/index.aspx?articleid=" + rdr[0].tostring() + "'>" + rdr[1].tostring() + "</a>");
writerfile.writeline("</td>");
if (0 == (rownum % memberinline))//a new line
{
writerfile.writeline("</tr>");
}
}
}
rdr.close();
}
writerfile.writeline("</table>");
}
三、xml网站地图的生成
xml网站地图的生成与html不同点在于,google等搜索引擎对这种网站地图的格式有严格的要求,必须遵守,否则不会被他们承认。具体xml文件格式可参考http://www.chituwang.com/article/wzjs/detail.aspx?articleid=18092
createxmlsitemap()函数的实现如下:
public void createxmlsitemap()
{
fileinfo xmlfile = null;
streamwriter writexmlfile = null;
string filepath = server.mappath("sitemap.xml");
xmlfile = new fileinfo(filepath);
writexmlfile = xmlfile.createtext();
//下面两句话必须写,而且不能做任何修改
writexmlfile.writeline("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
writexmlfile.writeline("<urlset xmlns=\"http://www.google.com/schemas/sitemap/0.84\">");
getxmlsitemapdata(writexmlfile);
writexmlfile.writeline("</urlset>");//别忘了这句话
writexmlfile.close();
}
createxmlsitemap()的实现如下:
public void getxmlsitemapdata(streamwriter writerfile)
{
string classtablename = "articleclass";
string articleitemtablename = "articleitem";
string connectionstring = configurationmanager.appsettings["sqlconnstring"].tostring();
sqlconnection conn = new sqlconnection(connectionstring);
if (conn.state == connectionstate.closed)
{
conn.open();
}
//查询大类信息
sqldataadapter classdataadpt = new sqldataadapter("select id, classname from " + classtablename, connectionstring);
dataset classdataset = new dataset();
classdataadpt.fill(classdataset, classtablename);
for (int i = 0; i < classdataset.tables[0].rows.count; i++)
{
string tempsql = "select id, articletitle, parentid from " + articleitemtablename + " where parentid = " + classdataset.tables[0].rows[i][0].tostring();
sqlcommand cmd = new sqlcommand(tempsql, conn);
if (conn.state == connectionstate.closed)
{
conn.open();
}
sqldatareader rdr = cmd.executereader(commandbehavior.closeconnection);
if (rdr.hasrows)
{
int subclassid = 0;
while (rdr.read())
{
//处理大类信息,
if (subclassid != int.parse(rdr[0].tostring()))
{
subclassid = int.parse(rdr[0].tostring());
writerfile.writeline("<url>");
writerfile.writeline("<loc>" + "http://www.chituwang.com/article/index.aspx?parentid=" + rdr[2].tostring() + "</loc>");
writerfile.writeline("<lastmod>" + datetime.now.toshortdatestring() + "</lastmod>");
writerfile.writeline("<changefreq>daily</changefreq>");
writerfile.writeline("<priority>0.5</priority>");
writerfile.writeline("</url>");
}
//处理文章信息
writerfile.writeline("<url>");
writerfile.writeline("<loc>" + "http://www.chituwang.com/article/index.aspx?articleid=" + rdr[0].tostring() + "</loc>");
writerfile.writeline("<lastmod>" + datetime.now.toshortdatestring() + "</lastmod>");
writerfile.writeline("<changefreq>monthly</changefreq>");
writerfile.writeline("<priority>0.4</priority>");
writerfile.writeline("</url>");
}
}
rdr.close();
}
}
通过上面两个小节的介绍,网页和xml两种形式的网站地图就生成了。
四、网站地图的提交
向google提交网站地图:
  https://www.google.com/webmasters/tools/login?hl=zh_cn
  1、进入这个网址,用你的google帐户登录,然后添加你的网址;
  2、接下来按照google的要求验证你网站,你可以选择html文件验证。
  3、这时候,按照google的要求,制作一个google要求的文件名的html文件
  4、用ftp讲这个html文件和你的xml格式的网站地图文件一起传到你网站的根目录
  5、确认验证,回到控制台,添加你的地图文件。很快,google就会根据网站地图文件来更新你的网站
向yahoo提交网站地图:
  英文yahoo提交网址:
  http://search.yahoo.com/info/submit.html
  首先用ftp讲你的网站地图传到网站的根目录。打开网址后,选择submit your site for free: 用yahoo帐户登录,然后输入你的网站地图的url就可以了。
  中文yahoo的提交网址:
  http://sitemap.cn.yahoo.com/mysites
  这个操作和google的差不多,登录、验证网站、提交网址地图url。
向msn提交网站地图sitemap: 用url直接提交:http://api.moreover.com/ping?u=http://your.domainname/sitemap.xml
这是向msn直接提交网站地图的后门url
向ask提交网站地图sitemap: 直接提交。http://submissions.ask.com/ping?sitemap=http://your.domainname/sitemap.xml
向网店联盟提交地址:http://www.dianmeng.com/
向百度baidu提交网站地图sitemap: 没办法,现在百度不支持sitemap。但可通过http://www.baidu.com/search/url_submit.html来提交你的网址。