Wie ich bereits im früheren Artikel BlogEngine.NET und die Ping Services erwähnt habe, verwendet BlogEngine.NET die XML-RPC API etwas seltsam. Das soll aber nicht Inhalt dieses Artikel sein. Statt dessen will ich die Ping Services effektiver nutzen.
BlogEngine.NET verwendet im Moment die Methode weblogUpdates.ping, in der laut API-Beschreibung lediglich der Name des Blog sowie die Basis-URL angegeben werden.
Die Methode weblogUpdates.extendedPing bietet da weitaus mehr Möglichkeiten an. Mit ihr können zusätzlich noch die Adresse des gerade veröffentlichten oder aktualisierten Artikel sowie die URL des RSS-Feed mit gesendet werden. Wenn gewünscht, können auch die Tags des Artikel angehängt werden.
Wenn diese Möglichkeit besteht, warum sie also nicht nutzen? Die Erweiterung der Methode AddXmlToRequest in der Klasse PingService ist leicht umzusetzen, wie folgendes Listing zeigt:
private static void AddXmlToRequest(HttpWebRequest request, Uri url)
{
var 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");
// Blog Name
writer.WriteStartElement("param");
writer.WriteElementString("value", BlogSettings.Instance.Name);
writer.WriteEndElement();
// Blog Basis-URL
writer.WriteStartElement("param");
writer.WriteElementString("value", url.GetLeftPart(UriPartial.Authority) + Utils.RelativeWebRoot);
writer.WriteEndElement();
// Artikel URL
writer.WriteStartElement("param");
writer.WriteElementString("value", url.ToString());
writer.WriteEndElement();
// Adresse des Rss-Feed
writer.WriteStartElement("param");
writer.WriteElementString("value", Utils.FeedUrl);
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndElement();
}
}Die meisten Ping Services unterstützen mittlerweile die Methode weblogUpdates.extendedPing ohne Probleme. Hier eine kleine Liste der von mir getesteten Dienste, bei denen die erweiterte Methode problemlos funktioniert:
- http://api.moreover.com/RPC2
- http://blogpingr.de/ping/rpc2
- http://blogsearch.google.com/ping/RPC2
- http://ping.blo.gs/
- http://ping.feedburner.com
- http://rpc.icerocket.com:10080
- http://rpc.weblogs.com/RPC2
- http://services.newsgator.com/ngws/xmlrpcping.aspx
- http://xmlrpc.bloggernetz.de/RPC2
Ein weiteres Manko von BlogEngine.NET im Umgang mit den Ping Services, ist die sparsame Verwendung derselben. Im Moment werden die Ping Services nur verwendet, wenn ein Artikel oder eine Seite gespeichert werden. Warum wird nicht auch auf Änderungen in den Kommentaren reagiert? Ein Blog lebt von den Kommentaren. Außerdem stellt in meinen Augen ein hinzugefügter oder entfernter Kommentar eine Änderung des Artikel dar. Oft genug wird in einem Kommentar ein wertvoller Hinweis, oder eine gut gemeinte Anmerkung zum Artikel gegeben, welche einem späteren Leser helfen können.
BlogEngine.NET bietet die Möglichkeit, bei Änderungen an den Kommentaren eines Post, ein Ereignis auszulösen. Damit ist die restliche Implementierung nur noch Formsache, wie man in folgendem Listing der statischen Klasse SendPings sehen kann:
static SendPings()
{
Post.Saved += new EventHandler<SavedEventArgs>(Post_Saved);
Page.Saved += new EventHandler<SavedEventArgs>(Post_Saved);
Post.CommentAdded += new EventHandler<EventArgs>(Post_Commented);
Post.CommentUpdated += new EventHandler<EventArgs>(Post_Commented);
Post.CommentRemoved += new EventHandler<EventArgs>(Post_Commented);
}Da die Kommentarereignisse einem anderen Typ der EventArgs-Klasse verwendet, muss noch eine zusätzliche Methode zum verarbeiten der Ereignisse eingefügt werden.
private static void Post_Commented(object sender, EventArgs e)
{
IPublishable item = (IPublishable)sender;
if (item.IsVisibleToPublic)
{
Uri url = item.AbsoluteLink;
ThreadPool.QueueUserWorkItem(delegate { Ping(item, url); });
}
}Jetzt werden beim Hinzufügen, Löschen oder Ändern eines Kommentar der Aufruf der Ping Services ausgelöst und so ein genaueres Abbild des Status des jeweiligen Artikel geliefert.
Da der Aufruf der Dienste in einem separaten ThreadPool ausgeführt wird, ist eine Beeinträchtigung der Leistung des Blog durch einen häufigeren Aufruf derselben kaum zu befürchten.
Fazit:
Wenn schon Ping Services in einem Blog verwendet werden um Aktualisierungen zu melden, warum soll dann nicht jede Aktualisierung gemeldet werden? Für mein Dafürhalten gehört auch ein hinzugefügter, entfernter oder geänderter Kommentar zur Aktualisierung eines Blog.
Wenn ihnen der Artikel gefallen hat oder er für sie hilfreich war, bitte "kicken" sie ihn.
