专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » web2.0:Web2.0特性—Pingback&Trackback »正文

web2.0:Web2.0特性—Pingback&Trackback

来源: 发布时间:星期四, 2009年2月12日 浏览:101次 评论:0


今天这篇文章主要向大家讲述下Blog系统中应用最多具有Web2.0特性也是种标准化——Pingback&Trackback分析下BlogEngine.Net提供比较全面Pingback&Trackback支持本文内容相对来说比较独立如果您对整个系列感兴趣请参照这里

Pingback&Trackback参考

简单地说Pingback&Trackback是博客在链接、引用其他博客内容时通知对方博客种自动机制告知对方链接位置及可能包含摘要文本(视情况而定)这样带来好处是显而易见对Pingback&Trackback发送者来说避免了手动通知对方麻烦;对Pingback&Trackback接收者而言则可以随时掌握自己某篇文章被什么人链接及具体链接信息等等例如:

博客A发布了篇文章;博客B看到后发布评论、引用、介绍博客A上该篇文章贴子;但此时博客A是无从知道博客B上对自己文章引用情况要让博客A知道博客B须:在博客A上留言介绍自己对该篇文章看法比如说“在我博客发布了篇文章也讨论这个问题——”并附上相应页面链接;向博客A发送E-mail介绍说明自己对该篇文章步讨论同时也许希望博客A能在页面上放上自己链接以帮助对这话题有兴趣用户能找到自己博客;Pingback&Trackback实现功能便是将第 3个步骤自动化了再也不需这么个繁琐过程即:博客A发布了篇文章;博客B看到后发布评论、引用、介绍博客A上该篇文章贴子;在文章发布时博客B即自动向博客A发送Pingback&Trackback;博客A收到相应Pingback&Trackback如果未设置人工审核相应内容即会出现在博客A该文留言中如果设置了人工审核则出现在博客A审核列表中博客A认为不是spam后将其发布在留言中

BlogEngine.Net中Pingback&Trackback实现

BlogEngine.Net中Pingback&Trackback实现主要涉及到以下几组文件:

1.Web站点App_Code/Extensions中:SendPings.cs
2.BlogEngine.CorePing中:PingService.cs、Manager.cs、Pingback.cs、Trackback.cs
3.BlogEngine.CoreWeb/HttpHandlers中:PingbackHandler.cs、TrackbackHandler.cs

从BlogEngine.Net中Pingback&Trackback具体实现来看Pingback和Trackback区别只在于数据交换格式上Pingback和PingService主要是使用标准XMLRPC来完成数据交换(上篇文章中有部分涉及)而Trackback主要request是使用类似下面格式完成:title={0}&url={1}&excerpt={2}&blog_name={3}response同样是使用XML传输

<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><response><error>0</error></response>
但是它们要实现功能是类似

实际上SendPings类是BlogEngine.Net个Extension(类具有Extension特性这个后面会有专门篇文章来讲解)它监听了Page.Saved和Post.Saved:

1 /// <summary>
2 /// Hooks up an event handler to the Post.Saved event.
3 /// </summary>
4 SendPings
5 {
6 Post.Saved EventHandler<SavedEventArgs>(Post_Saved);
7 Page.Saved EventHandler<SavedEventArgs>(Post_Saved);
8 }
这里再次证明了BusinessBase这种状态维护方式优越性

通过代码我们可以看出当Page或Post被保存时会向SendPings发出通知的后SendPings会从线程池中获得个线程来向PingService发送Ping消息并使用Manager发送Pingback&Trackback消息PingService这里主要是处理我们自己设置Ping服务对服务地址列表中服务发送通知来介绍说明某篇文章已经更新了Manager主要分析文章中超链接部分找到Trackback入口地址然后向该地址发送TrackbackTrackbackMessage(这是个消息封装注意它使用Trackback请求格式重写了思路方法)如果发送不成功再向这个地址发送Pingback消息Pingback和Trackback这两个类主要完成了Pingback&Trackback消息格式具体处理并执行发送的

Code
1/**//// <summary>
2/// Sends the pings in a thread.
3/// <remarks>
4/// It opens a thread and executes the pings from there,
5/// because it takes some time to complete.
6/// </remarks>
7/// </summary>
8private void Post_Saved(object sender, SavedEventArgs e)
9{
10 (e.Action SaveAction.None || e.Action SaveAction.Delete)
11 ;
12
13 IPublishable item = (IPublishable)sender;
14
15 ((HttpContext.Current null || !HttpContext.Current.Request.IsLocal) && item.IsVisible)
16 {
17 Uri url = item.AbsoluteLink;
18 ThreadPool.QueueUserWorkItem(delegate { Ping(item, url); });
19 }
20}
21
22/**//// <summary>
23/// Executes the pings from the thread.
24/// </summary>
25private void Ping(IPublishable item, Uri itemUrl)
26{
27 try
28 {
29 .Threading.Thread.Sleep(2000);
30
31 // Ping the specied ping services.
32 BlogEngine.Core.Ping.PingService.Send(itemUrl);
33
34 // Send trackbacks and pingbacks.
35 (!BlogSettings.Instance.EnableTrackBackSend && !BlogSettings.Instance.EnablePingBackSend)
36 ;
37
38 (item.Content.ToUpperInvariant.Contains("\"HTTP"))
39 BlogEngine.Core.Ping.Manager.Send(item, itemUrl);
40 }
41 catch (Exception)
42 {
43 // We need to catch this exception so the application doesn't get killed.


44 }
45}


使用PingbackHandler和TrackbackHandler对外提供支持

同样PingbackHandler和TrackbackHandler两个HttpHandler主要是为了使BlogEngine.Net也具有接收Pingback&Trackback消息并处理能力它们都是从请求中获得数据并将这些数据生成个Comment对象并关联到相应文章中同样它们也提供了ReceivedAcceptedRejectedSpammed 4个静态(类)事件来对这处理周期进行跟踪外部可以对这些事件提供相应处理来达到扩展请大家注意在Web站点中Post.aspx中有下面段代码:

<!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description rdf:about="<%=Post.AbsoluteLink %>" dc:identier="<%=Post.AbsoluteLink %>" dc:title="<%=Post.Title %>" trackback:ping="<%=Post.TrackbackLink %>" />
</rdf:RDF>
-->
这段代码被使用Html注释掉了生成Html为如下格式:

<!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description rdf:about="http://localhost/BlogEngine.Web/post/2008/06/28/Welcome-to-BlogEngineNET-1-4.aspx" dc:identier="http://localhost/BlogEngine.Web/post/2008/06/28/Welcome-to-BlogEngineNET-1-4.aspx" dc:title="Welcome to BlogEngine.NET 1.4.5" trackback:ping="http://localhost/BlogEngine.Web/trackback.axd?id=c3b491e5-59ac-4f6a-81e5-27e971b903ed" />
</rdf:RDF>
-->
http://localhost/BlogEngine.Web/trackback.axd?id=c3b491e5-59ac-4f6a-81e5-27e971b903ed实际上就是这篇文章Trackback地址

当然这个Trackback地址般可以由用户自己指定例如在博客园发文章时我们就可以自己输入
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: