使用.NET开发的网站程序,当我们发布文章的时候,我们希望自动通知百度自己的网站有文章发布了,这样就会引起百度的注意,这样对于百度的收录会有很好的效果,下面就讲解怎样自动Ping 百度,通知百度收录。
ping是基于XML_RPC标准协议的更新通告服务,用于博客把内容更新快速通知给百度、google等搜索引擎,以便搜索引擎及时进行抓取和更新。
你可以采取手动通知和自动通知两种方式使用ping服务:
访问http://ping.baidu.com/ping.html页面,在输入框中输入博客地址或者feed地址,点击“提交博客”按钮即可。
如果您的博客程序支持自动ping功能,您只需把百度的Ping服务地址配置到你的Blog发布后台或者客户端程序中,就可以实现自动通知的功能。百度ping服务的地址为:http://ping.baidu.com/ping/RPC2,所以当我们使用Wordpress建立博客的时候,只要把百度的ping服务地址加到通告服务的URL列表中,在“设置”->“撰写”菜单可以找到,如下图所示:
发送给百度Ping服务的XML-RPC客户请求需要包含如下元素:
以下是百度官方给出的Ping请求包的例子:
POST /ping/RPC2 HTTP/1.0
User-Agent: request
Host: ping.baidu.com
Content-Type: text/xml
Content-Length: 511
weblogUpdates.extendedPing
百度的空间
http://hi.baidu.com/baidu/
http://baidu.com/blog/example.html
http://hi.baidu.com/baidu/rss
xml-rpc响应http包体为一个xml文档,含有一个int值,0表示推送成功,其他值表示推送失败,目前只有0和1。推送成功时的服务器响应包为如下所示:
HTTP/1.1 200 OK
Date: Mon, 11 May 2009 11:54:53 GMT
Content-Length: 156
Connection: close
Content-Type: text/xml
0
如果推送失败如下所示:
HTTP/1.1 200 OK
Date: Mon, 11 May 2009 11:54:53 GMT
Content-Length: 156
Connection: close
Content-Type: text/xml
1
因此如果使用.NET的c#代码来进行自动Ping百度我们的思路就很明白了,就是推送一个和给出标准的XML格式。
////// 创建 MethodCall xml 来推送给百度的Ping服务。 /// /// ///public string CreateMethodCallXML(string methodName) { methodCall methodCall = new methodCall(); IList paramList = new List(); methodCall.methodName = methodName; //Blog name param param = new param(); value value = new value(); value.stringValue = "你的博客名称"; param.value = value; paramList.Add(param); //博客首页地址 param = new param(); value = new value(); value.stringValue = "博客的官网首页url地址"; param.value = value; paramList.Add(param); //博客文章的地址 param = new param(); value = new value(); value.stringValue = "博客文章的url地址"; param.value = value; paramList.Add(param); //博客的RSS地址 param = new param(); value = new value(); value.stringValue = "博客的RSS地址"; param.value = value; paramList.Add(param); methodCall.paramSet = paramList.ToArray(); return SerializeMethodCall(methodCall); }
methodCall类的代码如下所示,这是一个序列化的对象,用于创建xml
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Serialization; namespace PingBaidu { ////// Ping baidu. /// public partial class methodCall { ///[System.Xml.Serialization.XmlElementAttribute("methodName")] public string methodName { get; set;} /// [XmlArrayAttribute("params")] public param[] paramSet { get; set;} } [XmlRootAttribute("param")] public partial class param { /// [System.Xml.Serialization.XmlElementAttribute("value")] public value value {get; set;} } public partial class value { /// [System.Xml.Serialization.XmlElementAttribute("string")] public string stringValue {get; set;} } }
SerializeMethodCall方法如下所示,这是为了将序列化对象转换为xml字符串。
private string SerializeMethodCall(methodCall methodCall) { StringBuilder xmlBuilder = new StringBuilder(); using (StringWriter stringWriter = new StringWriter(xmlBuilder, CultureInfo.InvariantCulture)) { XmlTextWriter xmlWriter = new XmlTextWriter(stringWriter); xmlWriter.WriteProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\""); urlSetSerializer.Serialize(xmlWriter, methodCall); } return xmlBuilder.ToString(); }
通过http请求就xml字符串推送给百度ping服务器,通知百度文章的更新或新加。代码如下所示:
private string PingBaiduRequest(string requestURL, string pingBaiduXMLString) { try { byte[] postDataBytes = Encoding.UTF8.GetBytes(pingBaiduXMLString); HttpWebRequest request = HttpWebRequest.Create(requestURL) as HttpWebRequest; request.Accept = "application/json, text/javascript, */*; q=0.01"; request.ContentType = "application/x-www-form-urlencoded"; request.Method = "POST"; request.UserAgent = "request"; request.ProtocolVersion = new Version("1.0"); request.ContentLength = postDataBytes.Length; request.Timeout = 30000; using (Stream requestStream = request.GetRequestStream()) { requestStream.Write(postDataBytes, 0, postDataBytes.Length); } using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) using (Stream responseStream = response.GetResponseStream()) using (StreamReader reader = new StreamReader(responseStream)) { return reader.ReadToEnd(); } } catch (Exception e) { } return null; }
////// Ping 百度 /// public string PingBaidu() { string pingBaiduXMLString = CreateMethodCallXML("Ping百度的方法(通常为weblogUpdates.extendedPing)"); if (string.IsNullOrEmpty(pingBaiduXMLString)) return null; string result=PingBaiduRequest("ping 百度的URL(通常为http://ping.baidu.com/ping/RPC2)", pingBaiduXMLString); return result; }
根据返回的字符串可以判断是否ping百度成功与否。
意思就是.NET/C# 自动 Ping 百度的方法示例,希望可以帮助到需要的朋友,代码都是经过亲自测试可以通过的,只是需要把汉字描述的内容改成自己的地址即可。如有疑问,请给我留言,谢谢阅读。