ارسال PingBack در ASP.NET
نویسنده: وحید نصیری
تاریخ: ۱۳۹۳/۰۲/۰۸ ۷:۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
<link rel="pingback" href="pingback server">
private Uri findPingbackServiceUri()
{
var request = (HttpWebRequest)WebRequest.Create(_targetUri);
request.UserAgent = UserAgent;
request.Timeout = Timeout;
request.ReadWriteTimeout = Timeout;
request.Method = WebRequestMethods.Http.Get;
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
using (var response = request.GetResponse() as HttpWebResponse)
{
if (response == null) return null;
var url = extractPingbackServiceUriFormHeaders(response);
if (url != null)
return url;
if (!isResponseHtml(response))
return null;
using (var reader = new StreamReader(response.GetResponseStream()))
{
return extractPingbackServiceUriFormPage(reader.ReadToEnd());
}
}
}
private static Uri extractPingbackServiceUriFormHeaders(WebResponse response)
{
var pingUrl = response.Headers.AllKeys.FirstOrDefault(header =>
header.Equals("x-pingback", StringComparison.OrdinalIgnoreCase) ||
header.Equals("pingback", StringComparison.OrdinalIgnoreCase));
return getValidAbsoluteUri(pingUrl);
}
private static Uri extractPingbackServiceUriFormPage(string content)
{
if (string.IsNullOrWhiteSpace(content)) return null;
var regex = new Regex(@"(?s)<link\srel=""pingback""\shref=""(.+?)""", RegexOptions.IgnoreCase);
var match = regex.Match(content);
return (!match.Success || match.Groups.Count < 2) ? null : getValidAbsoluteUri(match.Groups[1].Value);
}
private static Uri getValidAbsoluteUri(string url)
{
Uri absoluteUri;
return string.IsNullOrWhiteSpace(url) || !Uri.TryCreate(url, UriKind.Absolute, out absoluteUri) ? null : absoluteUri;
}
private static bool isResponseHtml(WebResponse response)
{
var contentTypeKey = response.Headers.AllKeys.FirstOrDefault(header =>
header.Equals("content-type", StringComparison.OrdinalIgnoreCase));
return !string.IsNullOrWhiteSpace(contentTypeKey) &&
response.Headers[contentTypeKey].StartsWith("text/html", StringComparison.OrdinalIgnoreCase);
} public void Send()
{
var pingUrl = findPingbackServiceUri();
if (pingUrl == null)
throw new NotSupportedException(string.Format("{0} doesn't support pingback.", _targetUri.Host));
sendPing(pingUrl);
}
private void sendPing(Uri pingUrl)
{
var request = (HttpWebRequest)WebRequest.Create(pingUrl);
request.UserAgent = UserAgent;
request.Timeout = Timeout;
request.ReadWriteTimeout = Timeout;
request.Method = WebRequestMethods.Http.Post;
request.ContentType = "text/xml";
request.ProtocolVersion = HttpVersion.Version11;
makeXmlRpcRequest(request);
using (var response = (HttpWebResponse)request.GetResponse())
{
response.Close();
}
}
private void makeXmlRpcRequest(WebRequest request)
{
var stream = request.GetRequestStream();
using (var writer = new XmlTextWriter(stream, Encoding.ASCII))
{
writer.WriteStartDocument(true);
writer.WriteStartElement("methodCall");
writer.WriteElementString("methodName", "pingback.ping");
writer.WriteStartElement("params");
writer.WriteStartElement("param");
writer.WriteStartElement("value");
writer.WriteElementString("string", Uri.EscapeUriString(_sourceUri.ToString()));
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteStartElement("param");
writer.WriteStartElement("value");
writer.WriteElementString("string", Uri.EscapeUriString(_targetUri.ToString()));
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndElement();
}
} var doc = new HtmlWeb().Load(url);
var linkTags = doc.DocumentNode.Descendants("link");
var linkedPages = doc.DocumentNode.Descendants("a")
.Select(a => a.GetAttributeValue("href", null))
.Where(u => !String.IsNullOrEmpty(u));