部落格/網站發文後,主動通知 Ping 服務 (如 Technorati、Ping-O-Matic、Google Blog Search) 以加速收錄。標準協定為 **XML-RPC** `weblogUpdates.ping`。
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Xml;
using log4net; // 可替換為任意日誌框架
public class WeblogPinger
{
private static readonly ILog Log = LogManager.GetLogger(typeof(WeblogPinger));
private readonly string _siteName;
private readonly string _siteUrl;
private readonly string _pingServiceUrl;
private readonly int _timeoutMs = 3000;
public WeblogPinger(string siteName, string siteUrl, string pingServiceUrl)
{
if (string.IsNullOrWhiteSpace(siteName)) throw new ArgumentException("siteName");
if (string.IsNullOrWhiteSpace(siteUrl)) throw new ArgumentException("siteUrl");
if (string.IsNullOrWhiteSpace(pingServiceUrl)) throw new ArgumentException("pingServiceUrl");
_siteName = siteName;
_siteUrl = siteUrl;
_pingServiceUrl = pingServiceUrl;
}
public void Ping()
{
try
{
var request = (HttpWebRequest)WebRequest.Create(_pingServiceUrl);
request.Method = "POST";
request.ContentType = "text/xml; charset=utf-8";
request.Timeout = _timeoutMs;
request.Credentials = CredentialCache.DefaultNetworkCredentials;
using (var stream = request.GetRequestStream())
using (var writer = new XmlTextWriter(stream, Encoding.UTF8) { Formatting = Formatting.Indented })
{
writer.WriteStartDocument();
writer.WriteStartElement("methodCall");
writer.WriteElementString("methodName", "weblogUpdates.ping");
writer.WriteStartElement("params");
writer.WriteStartElement("param");
writer.WriteElementString("value", _siteName);
writer.WriteEndElement(); // param
writer.WriteStartElement("param");
writer.WriteElementString("value", _siteUrl);
writer.WriteEndElement(); // param
writer.WriteEndElement(); // params
writer.WriteEndElement(); // methodCall
}
using (var response = (HttpWebResponse)request.GetResponse())
{
// 可選:讀取回應 XML 解析錯誤碼
Log.Info($"Ping 送出成功: {_siteName} -> {_pingServiceUrl}, HTTP {response.StatusCode}");
}
}
catch (WebException ex) when (ex.Response is HttpWebResponse resp)
{
Log.Error($"Ping 失敗 HTTP {(int)resp.StatusCode}: {ex.Message}");
}
catch (Exception ex)
{
Log.Error($"Ping 異常: {ex.Message}", ex);
}
}
}
var pinger = new WeblogPinger(
siteName: "我的技術部落格",
siteUrl: "https://blog.example.com",
pingServiceUrl: "https://rpc.pingomatic.com/" // 或其他 Ping 服務
);
pinger.Ping();