Many blogs have the ability to ping different ping-services, such as Ping-o-Matic, Feedburner and Techorati, whenever some content is created or updated. But it is not only blogs who can benefit from pinging these services. Almost all websites that is updated regularly can use this technique.
All these services use XML_RPC and the exact same format, so you can write a ping class ones and then just add whatever ping service URL later. I’ve written a very simple static ping class that can be used in any ASP.NET application.
The code
Here is the the three methods needed to send XML-RPC pings.
Imports Microsoft.VisualBasic
Imports System.Xml
Imports System.IO
Imports System.Net
Public Class XMLRPCPingRequest
Public Function Send() As Boolean
Try
Dim lmessage As String = "", lstatus As Boolean
Dim lInformation As String = "The XML RPC response will have a Struct with three members:
"
lInformation &= "Status (Boolean) which is true/1 if an error occurred
"
lInformation &= "Status message (string) which contains ""Thanks for the ping"". if successful or an error message.
"
HttpContext.Current.Response.Write(lInformation)
Execute("http://blogsearch.google.com/ping/RPC2", lmessage, lstatus)
HttpContext.Current.Response.Write("Status Message: " & lmessage & " Status :" & lstatus & "
")
Execute("http://ping.myblog.jp", lmessage, lstatus)
HttpContext.Current.Response.Write("Status Message: " & lmessage & " Status :" & lstatus & "
")
Execute("http://rpc.weblogs.com/RPC2", lmessage, lstatus)
HttpContext.Current.Response.Write("Status Message: " & lmessage & " Status :" & lstatus & "
")
Catch ex As Exception
Throw ex
End Try
End Function
Private Sub Execute(ByVal pingserverUrl As String, ByRef lmessage As String, ByRef lStatus As Boolean)
Try
Dim request As HttpWebRequest
request = DirectCast(WebRequest.Create(pingserverUrl), HttpWebRequest)
request.Method = "POST"
request.ContentType = "text/xml"
request.Timeout = 3000
AddXmlToRequest(request)
'Read XML Response from Ping Server...
Try
Dim respMsg As String = ""
Using sr As StreamReader = New StreamReader(request.GetResponse().GetResponseStream())
respMsg = sr.ReadToEnd()
End Using
Dim x As New XmlDocument() : x.LoadXml(respMsg)
ProcessXmlResponseValue(x, lmessage, lStatus)
Catch ex As Exception
'Ignore the errors...
End Try
Catch ex As Exception
End Try
End Sub
Private Function AddXmlToRequest(ByVal request As HttpWebRequest) As Boolean
Try
Dim lstream As Stream = DirectCast(request.GetRequestStream(), Stream)
'Example :Ping methodName
Using writer As XmlTextWriter = New XmlTextWriter(lstream, Encoding.ASCII)
writer.WriteStartDocument()
writer.WriteStartElement("methodCall")
writer.WriteElementString("methodName", "weblogUpdates.ping") 'single XML-RPC Request:
writer.WriteStartElement("params")
writer.WriteStartElement("param")
' Add the name of your website here
writer.WriteElementString("value", "The name of your website")
writer.WriteEndElement()
writer.WriteStartElement("param")
' The absolute URL of your website
writer.WriteElementString("value", "http://nanthakumar-software.blogspot.com/")
writer.WriteEndElement()
writer.WriteEndElement()
writer.WriteEndElement()
End Using
''Example :extendedPing methodName
'' Extended Ping XML-RPC Request with multiple category tags:
'Using writer As XmlTextWriter = New XmlTextWriter(lstream, Encoding.ASCII)
' writer.WriteStartDocument()
' writer.WriteStartElement("methodCall")
' writer.WriteElementString("methodName", "weblogUpdates.extendedPing")
' writer.WriteStartElement("params")
' writer.WriteStartElement("param")
' ' Add the name of your website here
' writer.WriteElementString("value", "The name of your website")
' writer.WriteEndElement()
' writer.WriteStartElement("param")
' ' The absolute URL of your website
' writer.WriteElementString("value", "http://nanthakumar-software.blogspot.com/")
' writer.WriteEndElement()
' writer.WriteStartElement("param")
' ' The absolute URL of your website
' writer.WriteElementString("value", "http://nanthakumar-software.blogspot.com/")
' writer.WriteEndElement()
' writer.WriteEndElement()
' writer.WriteEndElement()
'End Using
Catch ex As Exception
End Try
End Function
Private Sub ProcessXmlResponseValue(ByVal XmlDoc As XmlDocument, ByRef lMessage As String, ByRef lStatus As Boolean)
Try
For i As Integer = 0 To XmlDoc.GetElementsByTagName("member").Count - 1
Dim lxmlNode As XmlNode
lxmlNode = XmlDoc.GetElementsByTagName("member").Item(i)
Select Case lxmlNode.Item("name").InnerText.ToUpper
Case "FLERROR" ' flerror (Boolean) which is true/1 if an error occurred
lStatus = GetBoolean(lxmlNode.Item("value").InnerText)
Case "MESSAGE"
lMessage = lxmlNode.Item("value").InnerText
End Select
Next
Catch ex As Exception
Throw ex
End Try
End Sub
Public Function GetBoolean(ByVal obj As Object) As Boolean
If IsDBNull(obj) Then Return False
Try
If obj.ToString = "True" Then
Return True
End If
Catch ex As Exception
End Try
Try
If CInt(obj.ToString) <> 0 Then
Return True
Else
Return False
End If
Catch ex As Exception
End Try
Return obj
End Function
End ClassImplementation
Download the class below and drop it into the App_Code folder or a class library. Then from anywhere in your ASP.NET project you can use the class by calling the Send method like so:
Dim o As New XMLRPCPingRequest
o.Send()
Because it can take some time to ping all the different services, you might want to consider doing it asynchronously. Here is how to do that. That’s it. Now you have a class that pings various services using XML-RPC.

No comments:
Post a Comment