.NET/C# 自动 Ping 百度的方法示例

知道91 | SEO | 2014-10-31 | 阅读:4114

使用.NET开发的网站程序,当我们发布文章的时候,我们希望自动通知百度自己的网站有文章发布了,这样就会引起百度的注意,这样对于百度的收录会有很好的效果,下面就讲解怎样自动Ping 百度,通知百度收录。

百度SEO、ping百度服务、快速收录、示例讲解、c#、.NET

什么是Ping服务

ping是基于XML_RPC标准协议的更新通告服务,用于博客把内容更新快速通知给百度、google等搜索引擎,以便搜索引擎及时进行抓取和更新。

Ping服务使用方法

你可以采取手动通知和自动通知两种方式使用ping服务:

手动ping

访问http://ping.baidu.com/ping.html页面,在输入框中输入博客地址或者feed地址,点击“提交博客”按钮即可。

自动ping

如果您的博客程序支持自动ping功能,您只需把百度的Ping服务地址配置到你的Blog发布后台或者客户端程序中,就可以实现自动通知的功能。百度ping服务的地址为:http://ping.baidu.com/ping/RPC2,所以当我们使用Wordpress建立博客的时候,只要把百度的ping服务地址加到通告服务的URL列表中,在“设置”->“撰写”菜单可以找到,如下图所示:

Wordpress 自动ping 百度、google搜索引擎

自动Ping的XML_RPC

发送给百度Ping服务的XML-RPC客户请求需要包含如下元素:

  • RPC端点: http://ping.baidu.com/ping/RPC2
  • 调用方法名: weblogUpdates.extendedPing
  • 参数: (应按照如下所列的相同顺序传送)
    1. 博客名称
    2. 博客首页地址
    3. 新发文章地址
    4. 博客rss地址

以下是百度官方给出的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
        
    

ping-service响应举例

  1. ping-service对非POST方法请求返回HTTP_METHOD_NOT_ALLOWED(405)错误代码
  2. 对超大错误包返回HTTP_REQUEST_ENTITY_TOO_LARGE(413)错误代码
  3. 对非“text/xml”请求包返回HTTP_UNSUPPORTED_MEDIA_TYPE(415)错误代码
  4. 其他情况返回HTTP_OK(200)代码

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格式。

1、创建一个推送百度的MethodCall 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;}
    }
}

2、将序列化对象转化为xml字符串推送给百度ping服务

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();
}

3、推送xml字符串给百度ping服务

通过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;
}

4、最后综合各个方法对百度进行ping服务通知收录

/// 
/// 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 百度的方法示例,希望可以帮助到需要的朋友,代码都是经过亲自测试可以通过的,只是需要把汉字描述的内容改成自己的地址即可。如有疑问,请给我留言,谢谢阅读。