在我的前一篇文章Ping Service--你的博客“Ping”了吗? 中,我介绍了Ping Service技术的一些情况,然后我提到我目前使用的虚拟主机不支持发送Ping命令的功能,这使我决定自己写一个发送Ping命令的桌面程序。
Ping Service的客户端请求目前有两个接口:weblogUpdates.ping 和 weblogUpdates.extendedPing,后者兼容前者。大部分的Ping Service服务器都同时支持这两个接口,但对这两个版本的ping命令通常都按相同方式处理,也就是说都按weblogUpdates.ping方式处理。考虑到今后的发展,我决定在程序中只使用weblogUpdates.extendedPing接口。
weblogUpdates.extendedPing接口的XML RPC请求定义如下:
RPC端点:
就是提供Ping Service的服务器地址,如:http://rpc.weblogs.com/RPC2
调用方法名:
weblogUpdates.extendedPing
参数: (按以下顺序发送) 
博客名称 
字符串,最大1024个字符。如:“Tiray软件博客”
博客网站地址  
字符串,最大255个字符。 如:“http://www.tiray.net”
博客网站的订阅地址 
字符串,最大255个字符。如:“http://www.tiray.net/syndication.axd”
需要检查更新的页面URL 
字符串,最大255个字符。 如“http://www.tiray.net/default.aspx”
博客标签 
可选,字符串,最大1024个字符。多个标签之间以“|" 分隔。如:“软件开发|.net|c#” 
weblogUpdates.extendedPing接口的XML RPC响应包括三个参数:
flerror
布尔型,如果有错误则为1
message
字符串,如果发送请求成功,通常返回的是“Thanks for the ping.”,如果flerror为1,则返回错误信息。
legal
字符串,Ping Service服务提供者的申明,通常为空。weblog.com的legal值是:“You agree that use of the Weblogs.com ping service is governed by the Terms of Use found at www.weblogs.com.”
关于Ping Service客户端的详细说明,请浏览http://www.weblogs.com/api.html,或者可以去http://www.google.com/intl/zh-CN/help/blogsearch/pinging_API.html看一看Google的Ping Service API说明。
下面来看看在我的程序中是如何实现发送Ping命令的:
        private void Ping(string url)
        {
            try
            {
                Thread.Sleep(500);
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = "POST";
                request.ContentType = "text/xml";
                request.Timeout = 3000;
                request.Credentials = CredentialCache.DefaultNetworkCredentials;
                AddXmlToRequest(request);
                
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    XmlDocument doc = new XmlDocument();
                    doc.Load(response.GetResponseStream());
                    ......
                }
            }
            catch (Exception e)
            {
                ......
            }
        }
        /// <summary>
        /// 构造Ping Service的 RPC-XML 请求.
        /// </summary>
        private  void AddXmlToRequest(HttpWebRequest request)
        {
            Stream stream = (Stream)request.GetRequestStream();
            using (XmlTextWriter writer = new XmlTextWriter(stream, Encoding.ASCII))
            {
                writer.WriteStartDocument();
                writer.WriteStartElement("methodCall");
                writer.WriteElementString("methodName", "weblogUpdates.extendedPing");
                writer.WriteStartElement("params");
                writer.WriteStartElement("param");
                writer.WriteElementString("value",tb_BlogName.Text.Trim());
                writer.WriteEndElement();
                writer.WriteStartElement("param");
                writer.WriteElementString("value", tb_BlogUrl.Text.Trim());
                writer.WriteEndElement();
                writer.WriteStartElement("param");
                writer.WriteElementString("value", tb_PageUrl.Text.Trim());
                writer.WriteEndElement();
                writer.WriteStartElement("param");
                writer.WriteElementString("value", tb_FeedUrl.Text.Trim());
                writer.WriteEndElement();
                writer.WriteStartElement("param");
                writer.WriteElementString("value", tb_Tags.Text.Trim());
                writer.WriteEndElement();
                writer.WriteEndElement();
                writer.WriteEndElement();
            }
        } 
好了,现在我有了一个可以在Windows桌面环境下运行的发送Ping命令的工具了,虽然麻烦一点,每次更新博客之后都要运行这个程序发送Ping命令,但好处是比较直观,想发就发。最终的程序界面如下所示,我在右边列出了Tiray软件博客的最新15条更新,算是帮自己宣传一下吧,呵呵!

如果你对这个程序感兴趣,可以到以下地址下载,注意我是用C#写的,如果你的电脑没装那个有10多M的讨厌的.NET Framework 2.0话...... 
下载地址:
http://www.tiray.net/page/Tiray-Blog-Ping.aspx 
如果你想进一步了解XML RPC技术,可以去http://www.xml-rpc.net/看看,这是一个开源的C#项目,你甚至可以用它来实现一个Ping Service服务器。
 
                    
                 
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号