using System; using System.Collections.Generic; using System.Text; using System.Net; using System.IO; using System.Xml; namespace PageStatus { public class PageStatusTester { string requestUrl, cachedHeaderList, cachedHeaderHtmlTable, cachedDefinitionList, contentType, content, server, responseUrl, error, userAgent; bool autoRedirect, deferTesting, isReady, xmlCacheIsStale; HttpStatusCode status; WebHeaderCollection headers; IPAddress ipAddress; Uri uri; XmlDocument xml; #region Class constructor public PageStatusTester() { } public PageStatusTester(string url) { Url = url; } public PageStatusTester(Uri uri) { Url = uri.ToString(); } public PageStatusTester(string url, bool deferIO) { if (deferTesting = deferIO) requestUrl = url; else Url = url; } public PageStatusTester(Uri uri, bool deferIO) { if (deferTesting = deferIO) requestUrl = uri.ToString(); else Url = uri.ToString(); } #endregion #region Real work void Clear(string newRequestUrl) { requestUrl = newRequestUrl; cachedHeaderList = string.Empty; cachedHeaderHtmlTable = string.Empty; contentType = string.Empty; content = string.Empty; server = string.Empty; error = string.Empty; status = 0; headers = null; ipAddress = null; isReady = false; xmlCacheIsStale = true; xml = null; } public void TestStatus() { Clear(requestUrl); try { HttpWebRequest req = (HttpWebRequest)WebRequest.Create(requestUrl); req.AllowAutoRedirect = autoRedirect; if (!string.IsNullOrEmpty(userAgent)) req.UserAgent = userAgent; HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); status = resp.StatusCode; headers = resp.Headers; for (int i = 0; i != resp.Headers.Count; i++) { cachedHeaderList += resp.Headers.AllKeys[i] + "\t=\t" + resp.Headers[i] + "\n"; cachedHeaderHtmlTable += "" + resp.Headers.AllKeys[i] + "" + resp.Headers[i] + ""; cachedDefinitionList += "
" + resp.Headers.AllKeys[i] + "
" + resp.Headers[i] + "
"; } cachedHeaderHtmlTable = "
NameValue" + cachedHeaderHtmlTable + "
"; cachedDefinitionList = "
" + cachedDefinitionList + "
"; server = resp.Server; responseUrl = resp.ResponseUri.ToString(); IPAddress[] ips = System.Net.Dns.GetHostAddresses(resp.ResponseUri.DnsSafeHost); if (ips.Length > 0) ipAddress = ips[0]; contentType = resp.ContentType; StreamReader tempReader = new StreamReader(resp.GetResponseStream()); content = tempReader.ReadToEnd(); tempReader.Dispose(); } catch (WebException ex) { if (ex.Message.Contains("404")) status = System.Net.HttpStatusCode.NotFound; error = ex.Message; } isReady = true; } public string Url { get { return requestUrl; } set { requestUrl = value; uri = new Uri(value); isReady = false; if (!deferTesting) TestStatus(); } } #endregion #region Properties - Set behavior /// /// Gets or sets a value indicating whether redirects will be honored. If you need to /// learn whether a page is using a 301/permenant vs a 302/temporary redirect, this /// must be set to false. If you want to see whether the page that’s redirected TO /// works properly, setting true will create and report on a new request against the /// Location header. /// public bool AutoRedirect { get { return autoRedirect; } set { autoRedirect = value; } } public string UserAgent { get { return userAgent; } set { userAgent = value; } } #endregion #region Properties - expose the collected data public bool IsReady { get { return isReady; } } public int HttpStatusCode { get { if (!IsReady) TestStatus(); return (int)status; } } public string HttpStatusDescription { get { if (!IsReady) TestStatus(); return status.ToString(); } } public WebHeaderCollection Headers { get { if (!IsReady) TestStatus(); return headers; } } public string HeaderText { get { if (!IsReady) TestStatus(); return cachedHeaderList; } } public string HeaderHtmlTable { get { if (!IsReady) TestStatus(); return cachedHeaderHtmlTable; } } public string ContentType { get { if (!IsReady) TestStatus(); return contentType; } } public string Content { get { if (!IsReady) TestStatus(); return content; } } public IPAddress IPAddress { get { if (!IsReady) TestStatus(); return ipAddress; } } public string Server { get { return server; } } #endregion #region Properties - calculate on the fly public string Domain { get { if (!IsReady) TestStatus(); return uri == null ? string.Empty : uri.Host; } } public string Page { get { if (!IsReady) TestStatus(); return uri == null ? string.Empty : uri.PathAndQuery; } } public XmlDocument Xml { get { if (!xmlCacheIsStale) return xml; if (IsValidXml) return xml; return null; } } public bool IsValidXml { get { try { if (!xmlCacheIsStale) return xml != null; if (!IsReady) TestStatus(); xml = new XmlDocument(); xml.LoadXml(content); xmlCacheIsStale = false; } catch (Exception ex) { return false; } return true; } } #endregion } }