许多个人和公司的网站主要由静态页面组成,但有时需要向客户更新信息或发布公司新闻。这些网站通常需要实际更新代码才能发布这些新闻项目或更新。对于小型公司来说,一种动态维护这些页面的方法是将其集成到博客站点中,博客的内容会自动被拉取到需要更新的页面上。这提供了一种无需触摸网站代码或进行部署即可管理这些页面上的内容的方法。博客的更新会直接反映在目标页面上。本文提供了使用blogger网站和ASP.NET网站实现这一特性的一个示例。
示例代码是用C# 3.5编写的,示例网页设计在VS2008中。它应该很容易升级到VS2010。
该项目实现为一个自定义DLL(Incede.BloggerInteg.dll),该组件有一个BlogService类,它有一个公共方法GetUserBlogs(),返回指定blogger网站上发布的一个博客列表。BlogService服务类的构造函数接受博客名称、用户ID、博客密码作为参数。同时包括在构造函数中的是拉取的博客条目数量。组件的核心是Google的两个API,用于访问blogger系统。
public List<blogentry> GetUserBlogs()
{
if (blogname.Trim().Equals(String.Empty))
blogname = "incedeit.blogspot.com";
if (numberOfEntries <= 0)
numberOfEntries = 10;
var gService = new Google.GData.Client.Service("blogger", blogname);
gService.Credentials = new GDataCredentials(username, password);
Uri blogPostUri = SelectUserBlog(gService, blogname);
List<blogentry> blogs = GetBlogEntryContent(gService, blogPostUri, numberOfEntries);
return blogs;
}
这是核心过程的方法,用于识别用户博客。首先从查询创建一个atomfeed,然后过滤到用户博客。这个用户博客是通过一个静态URI识别的。
static Uri SelectUserBlog(Service service, string blogname)
{
FeedQuery query = new FeedQuery();
query.Uri = new Uri("http://www.blogger.com/feeds/default/blogs");
AtomFeed feed = service.Query(query);
Uri blogPostUri = null;
if (feed != null)
{
foreach (AtomEntry entry in feed.Entries)
{
if (entry.AlternateUri.Content.Contains(blogname))
{
for (int i = 0; i < entry.Links.Count; i++)
{
if (entry.Links[i].Rel.Equals("http://schemas.google.com/g/2005#post"))
{
blogPostUri = new Uri(entry.Links[i].HRef.ToString());
}
}
return blogPostUri;
}
}
}
return blogPostUri;
}
这个方法最终遍历用户博客URI识别的条目,并从博客中提取相关内容,如标题、内容和页脚。
static List<blogentry> GetBlogEntryContent(Service service, Uri blogUri, int numberOfEntries)
{
List<blogentry> allblogs = new List<blogentry>();
if (blogUri != null)
{
FeedQuery query = new FeedQuery();
query.Uri = blogUri;
query.NumberToRetrieve = numberOfEntries;
AtomFeed feed = service.Query(query);
foreach (AtomEntry entry in feed.Entries)
{
BlogEntry b = new BlogEntry();
b.Title = entry.Title.Text;
b.content = entry.Content.Content;
b.footer = String.Format("Posted on {0}", entry.Published.ToString());
allblogs.Add(b);
}
}
return allblogs;
}
要使用该组件,只需创建一个服务实例Incede.BloggerInteg.BlogService,并提供一些参数,例如博客名称、凭据和感兴趣的博客条目数量。这些参数在示例项目中的web.config中定义。服务返回一个IList的博客条目类,具有博客标题、博客内容和页脚等属性。ShowBlogEntries简单地将博客条目格式化为数据列表以供显示。
Incede.BloggerInteg.BlogService Biservicc = new Incede.BloggerInteg.BlogService(blogname, userid, pwd, int.Parse(entries));
List<incede.bloggerinteg.blogentry> blogs = Biservicc.GetUserBlogs();
ShowBlogEntries(blogs, blogname);
bin目录应包含以下支持DLL:Google.GData.Blogger.dll和Google.GData.Client.dll。web.config应该有以下条目,用于博客站点的URL和凭据:blogName、blogUserid、blogPass、noOfEntries。如果需要,可以修改核心服务以返回blogger站点的额外参数。实现具有最基本所需的项目。
使用了一个示例博客来说明这个项目的概念。实际的博客站点是http://incedeblogger.blogspot.com。博客的任何更新都会自动拉取到示例项目网页中。可以在网站http://www.incedeit.com/main/UI/News.aspx上看到实际的实时实现。