【搬迁】单步跑过BlogEngine的Trackback——系统调试&Trackback介绍

用BlogEngine的代码扒了下Trackback的代码直接搬到了Librazyframe上,结果根本跑不起来:

System.Net.WebException: 请求被中止: 请求已被取消。 —> System.IO.IOException: 在写入所有字节之前不能关闭流。

在写入所有字节之前不能关闭流?好像用到流的只有

整了半天,决定跑单步调试。根据 BlogEngine.Net架构与源代码分析系列part7:Web2.0特性——Pingback&Trackback找到了入口点SendPing.cs

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

PostSaved监听Page.Saved和Post.Saved,当并非删除、无动作或不公开时,异步执行Ping(item, url)

Ping方法睡两秒(为什么?),执行PingService.Send(itemUrl);和Manager.Send(item, itemUrl);

这就是真正的入口了。

f12到Manager.cs

首先尝试发送Trackback,未成功则发送Pingback。不过GetTrackBackUrlFromPage好像不识别WordPress的rel="trackback",只认Trackback:Ping

继续F12,到了Trackback.cs

30行完全把中文置于不顾,这就是开头的异常产生的原因。(行号以所贴代码计算)

修改一下,开始单步

注释以下几行

SendPing.cs 38,41 Thread.Sleep(2000); PingService.Send(itemUrl);

修改Trackback.cs

发起请求了

一堆设置,应注意的是application/x-www-form-urlencoded这是,Trackback的格式

这是我修改后的写入,真正的核心代码实际上就只有message.ToString(),进去看看

真正我们要发送的就是“title=xx&url=xx&excerpt=xx&blog_name=xx”,

  title – 文章的标题

  excerpt – 文章的摘要。在Movable Type系统中,如果摘录信息超过255个字符将会被截断为252个字符,并在后面增加…三个字符

  url – 文章的永久连接。象其它永久连接一样,这个连接应可能准确地在页面中定位文章的入口,因有疑问时这个链接会用到

  blog_name – 发表文章的blog的名称

而这些参数,是在Manager.cs 17传入的(BlogName是BlogSettings.Instance.Name)

把这个字符串转化为byte[]后写入请求,

获取响应(看来更改没错,测试网址马上接到了Trackback)。如果成功,响应会包含"<error>0</error>",否则失败。出了异常更不用说了。

返回后到了Manager.cs 22,如果trackbackSent为false,则发送Pingback

Pingback实现和Trackback大同小异,只不过是用了Xmlrpc而已

F5放水,结束了单步,看来BlogEngine也有挺多毛病的……不能自动发现WordPress的Trackback URL,Trackback消息不能带中文,发送Trackback或Pingback时可能无法捕获超时异常……不过BusinessBase这种状态维护方式还是挺不错的。