首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

.NET 實作 Ping 服務監控:HttpWebRequest 模擬 Weblog Ping (XML-RPC)

     編輯:ASP.NET 基礎

應用場景

部落格/網站發文後,主動通知 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();

常見 Ping 服務端點

  • `https://rpc.pingomatic.com/` (聚合多個服務)
  • `https://blogsearch.google.com/ping/RPC2` (Google)
  • `https://rpc.technorati.com/rpc/ping` (Technorati)
  • `https://ping.feedburner.com/` (FeedBurner)
  • `https://api.my.yahoo.com/RPC2` (Yahoo)

現代替代:WebSub (PubSubHubbub) / IndexNow

  • WebSub:發布者通知 Hub,Hub 推送給訂閱者,即時性更高。
  • IndexNow (Bing/Yandex/Seznam):簡單 HTTP POST 提交 URL 變更,主流搜尋引擎支援,實作更輕量。
  • 建議**並行**使用傳統 Ping + IndexNow 以最大化收錄速度。

效能與可靠性建議

  1. 非同步/背景佇列:發文後放入 Hangfire/Quartz/HostedService 非同步執行,避免阻塞使用者請求。
  2. 重試機制:指數退避重試 3 次 (Polly)。
  3. 超時設定:3-5 秒,防止殭屍連線佔用執行緒。
  4. 記錄回應:解析 XML-RPC 回應 `0` 成功、`1` 失敗,便於監控。
  5. User-Agent:設定可識別的 User-Agent,部分服務拒絕空 UA。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved