您目前尚未登陆,请选择【登陆】或【注册
首页->博客论坛->SpaceBuilder v1.0正式版源码>>BlogControls/HttpHandler/TrackBackHandler.cs>>源码在线查看
温馨提示:代码在线浏览功能只能做为源码浏览参考,如果想更进一步了解该代码请下载:SpaceBuilder v1.0正式版源码
普通视图
		            
1//------------------------------------------------------------------------------ 2// <copyright company="Tunynet"> 3// Copyright (c) Tunynet Network Technology Co., Ltd. All rights reserved. 4// </copyright> 5//------------------------------------------------------------------------------ 6 7using System; 8using System.Collections.Generic; 9using System.Text; 10using System.Web; 11using SpaceBuilder.Components; 12using SpaceBuilder.Blogs.Components; 13using TunyNet.Utils; 14using SpaceBuilder.Posts.Permissions; 15using System.Xml; 16using System.Text.RegularExpressions; 17 18namespace SpaceBuilder.Blogs.Controls 19{ 20 /// <summary> 21 /// Summary description for TrackBackHandler. 22 /// </summary> 23 public class TrackBackHandler : IHttpHandler 24 { 25 public TrackBackHandler() 26 { } 27 28 public void ProcessRequest(HttpContext context) 29 { 30 context.Response.ContentType = "text/xml"; 31 User user = SBContext.Current.User; 32 int postId = 0; 33 try 34 { 35 postId = int.Parse(context.Request.QueryString["postid"]); 36 } 37 catch 38 { 39 trackbackResponse(context, 1, "EntryID is invalid or missing"); 40 } 41 42 43 if (context.Request.HttpMethod == "POST") 44 { 45 string title = safeParam(context, "title"); 46 string excerpt = safeParam(context, "excerpt"); 47 string url = safeParam(context, "url"); 48 string blog_name = safeParam(context, "blog_name"); 49 50 if (!ValueHelper.IsNullOrEmpty(excerpt)) 51 excerpt = HtmlUtils.TrimHtml(excerpt, 250); 52 try 53 { 54 // is the url valid ? 55 if (url == "") 56 trackbackResponse(context, 1, "no url parameter found, please try harder!"); 57 58 string pageTitle = null; 59 60 BlogThread trackedEntry = BlogPosts.GetThread(postId, true); 61 62 if (trackedEntry == null) 63 trackbackResponse(context, 2, "The link does not exist"); 64 65 66 Weblog wl = trackedEntry.Section as Weblog; 67 68 Permissions.AccessCheck(wl, Permission.View, user); 69 70 if (!wl.EnableTrackbacks) 71 { 72 trackbackResponse(context, 2, "Trackbacks are not enabled"); 73 return; 74 } 75 76 if (!IsNewTrackBack(trackedEntry, url)) 77 { 78 trackbackResponse(context, 2, "Trackbacks already exists"); 79 return; 80 81 } 82 83 if (trackedEntry != null && !SourceContainsTarget(url, WebUtils.FullPath(BlogUrls.Instance().ShowPost(trackedEntry, wl)), out pageTitle)) 84 { 85 trackbackResponse(context, 2, "Sorry couldn't find a relevant link in " + url); 86 } 87 88 BlogPost entry = new BlogPost(); 89 entry.BlogPostType = BlogPostType.Trackback; 90 entry.SectionID = wl.SectionID; 91 entry.ParentID = postId; 92 entry.Subject = title; 93 entry.TitleUrl = url; 94 entry.TrackBackName = blog_name; 95 entry.Body = excerpt; 96 entry.IsApproved = true; 97 entry.PostDate = DateTime.Now; 98 //entry.BloggerTime = DateTime.Now; 99 BlogPosts.CreatePost(entry); 100 } 101 catch (System.Threading.ThreadAbortException) { } 102 catch (System.Exception ex) 103 { 104 if (ex.Message != null) 105 trackbackResponse(context, 0, string.Format("Error occurred while processing Trackback: {0}", ex.Message)); 106 else 107 trackbackResponse(context, 0, "Unknown error occurred while processing Trackback."); 108 } 109 } 110 else 111 { 112 BlogThread entry = BlogPosts.GetThread(postId, true); 113 114 Weblog wl = entry.Section as Weblog; 115 Permissions.AccessCheck(wl, Permission.View, user); 116 117 XmlTextWriter w = new XmlTextWriter(context.Response.Output); 118 w.Formatting = Formatting.Indented; 119 120 w.WriteStartDocument(); 121 w.WriteStartElement("response"); 122 w.WriteElementString("error", "0"); 123 w.WriteStartElement("rss"); 124 w.WriteAttributeString("version", "0.91"); 125 w.WriteStartElement("channel"); 126 w.WriteElementString("title", entry.Subject); 127 w.WriteElementString("link", BlogUrls.Instance().TrackbackPingUrl(postId)); 128 w.WriteElementString("description", ""); 129 w.WriteElementString("language", "en-us"); 130 131 w.WriteEndElement(); // channel 132 w.WriteEndElement(); // rss 133 w.WriteEndElement(); // response 134 w.WriteEndDocument(); 135 } 136 137 } 138 139 public bool IsReusable 140 { 141 get { return true; } 142 } 143 144 private void trackbackResponse(HttpContext context, int errNum, string errText) 145 { 146 // Log trackback failure messae to the EventLog 147 string message = String.Format("Trackback request received by SpaceBuilder but failed due to one or more reasons. The request URL was [{0}]. Error message returned was: {1}.", context.Request.RawUrl, errText); 148 149 XmlDocument d = new XmlDocument(); 150 XmlElement root = d.CreateElement("response"); 151 d.AppendChild(root); 152 XmlElement er = d.CreateElement("error"); 153 root.AppendChild(er); 154 er.AppendChild(d.CreateTextNode(errNum.ToString())); 155 if (errText != "") 156 { 157 XmlElement msg = d.CreateElement("message"); 158 root.AppendChild(msg); 159 msg.AppendChild(d.CreateTextNode(errText)); 160 } 161 d.Save(context.Response.Output); 162 context.Response.End(); 163 } 164 165 private string safeParam(HttpContext context, string pName) 166 { 167 if (context.Request.Form[pName] != null) 168 return WebUtils.HtmlEncode(context.Request.Form[pName]); 169 return string.Empty; 170 } 171 172 public static bool SourceContainsTarget(string sURI, string tURI, out string pageTitle) 173 { 174 pageTitle = string.Empty; 175 string page = SBRequest.GetPageText(sURI, tURI); 176 if (page == null || page.IndexOf(tURI) < 0) 177 return false; 178 179 string pat = @"<head.*?>.*<title.*?>(.*)</title.*?>.*</head.*?>"; 180 Regex reg = new Regex(pat, RegexOptions.IgnoreCase | RegexOptions.Singleline); 181 Match m = reg.Match(page); 182 if (m.Success) 183 { 184 pageTitle = HtmlUtils.TrimHtml(m.Result("$1")); 185 return true; 186 } 187 188 return false; 189 } 190 191 protected static bool IsNewTrackBack(BlogThread post, string trackbackUrl) 192 { 193 BlogPostSetQuery query = new BlogPostSetQuery(); 194 query.PostID = post.PostID; 195 query.ReturnFullThread = true; 196 197 PostSet ps = BlogPosts.GetPostSet(query); 198 199 foreach (BlogPost p in ps.Replies) 200 { 201 if ((string.Compare(trackbackUrl, p.TitleUrl, true) == 0) && (p.BlogPostType == BlogPostType.Trackback)) 202 return false; 203 } 204 205 return true; 206 } 207 208 209 210 } 211} 212 213
还没有找到您心仪的内容?请用.net源码大搜捕
代码片断 打包下载该项目完整源码:SpaceBuilder v1.0正式版源码