/// <summary> /// Gets the <see cref="ErrorLog"/> instance to which the module /// will log exceptions. /// </summary> protected virtual ErrorLog GetErrorLog(HttpContextBase context) { return(ErrorLog.GetDefault(context)); }
public void ProcessRequest(HttpContext context) { context.Response.ContentType = "application/xml"; // // Get the last set of errors for this application. // const int pageSize = 15; ArrayList errorEntryList = new ArrayList(pageSize); ErrorLog log = ErrorLog.GetDefault(context); log.GetErrors(0, pageSize, errorEntryList); // // We'll be emitting RSS vesion 0.91. // RichSiteSummary rss = new RichSiteSummary(); rss.version = "0.91"; // // Set up the RSS channel. // Channel channel = new Channel(); channel.title = "Error log of " + log.ApplicationName + " on " + Environment.MachineName; channel.description = "Log of recent errors"; channel.language = "en"; channel.link = context.Request.Url.GetLeftPart(UriPartial.Authority) + context.Request.ServerVariables["URL"]; rss.channel = channel; // // For each error, build a simple channel item. Only the title, // description, link and pubDate fields are populated. // channel.item = new Item[errorEntryList.Count]; for (int index = 0; index < errorEntryList.Count; index++) { ErrorLogEntry errorEntry = (ErrorLogEntry)errorEntryList[index]; Error error = errorEntry.Error; Item item = new Item(); item.title = error.Message; item.description = "An error of type " + error.Type + " occurred. " + error.Message; item.link = channel.link + "/detail?id=" + HttpUtility.UrlEncode(errorEntry.Id); item.pubDate = error.Time.ToUniversalTime().ToString("r"); channel.item[index] = item; } // // Stream out the RSS XML. // XmlSerializer serializer = new XmlSerializer(typeof(RichSiteSummary)); serializer.Serialize(context.Response.Output, rss); }
/// <summary> /// Gets the <see cref="ErrorLog"/> instance to which the module /// will log exceptions. /// </summary> protected virtual ErrorLog GetErrorLog(HttpContext context) { return(ErrorLog.GetDefault(new HttpContextWrapper(context))); }
public override void Execute() { WriteLiteral("\r\n"); #line 7 "..\..\ErrorDetailPage.cshtml" var basePageName = Request.ServerVariables["URL"]; // // Retrieve the ID of the error to display and read it from // the store. // var errorId = Request.QueryString["id"] ?? string.Empty; if (errorId.Length == 0) { return; } var log = this.ErrorLog ?? ErrorLog.GetDefault(Context); var errorEntry = log.GetError(errorId); // // Perhaps the error has been deleted from the store? Whatever // the reason, bail out silently. // if (errorEntry == null) { Response.Status = HttpStatus.NotFound.ToString(); #line default #line hidden WriteLiteral(" <p>Error not found in log.</p>\r\n"); #line 34 "..\..\ErrorDetailPage.cshtml" return; } var title = string.Format("Error: {0} [{1}]", errorEntry.Error.Type, errorEntry.Id); Layout = new Elmah.MasterPage { Context = Context, /* TODO Consider not requiring this */ Title = title, Footnote = string.Format("This log is provided by the {0}.", log.Name), SpeedBarItems = new[] { SpeedBar.Home.Format(basePageName), SpeedBar.Help, SpeedBar.About.Format(basePageName), }, }; var error = errorEntry.Error; #line default #line hidden WriteLiteral("\r\n"); WriteLiteral("\r\n\r\n<h1 id=\"PageTitle\">"); #line 59 "..\..\ErrorDetailPage.cshtml" Write(error.Message); #line default #line hidden WriteLiteral("</h1>\r\n\r\n<p id=\"ErrorTitle\">"); WriteLiteral("<span id=\"ErrorType\">"); #line 62 "..\..\ErrorDetailPage.cshtml" Write(error.Type); #line default #line hidden WriteLiteral("</span>"); WriteLiteral("<span id=\"ErrorTypeMessageSeparator\">: </span>"); WriteLiteral("<span id=\"ErrorMessage\">"); #line 64 "..\..\ErrorDetailPage.cshtml" Write(error.Message); #line default #line hidden WriteLiteral("</span></p>\r\n\r\n"); WriteLiteral("\r\n\r\n"); #line 74 "..\..\ErrorDetailPage.cshtml" if (error.Detail.Length != 0) { #line default #line hidden WriteLiteral(" <pre id=\"ErrorDetail\">"); #line 76 "..\..\ErrorDetailPage.cshtml" Write(MarkupStackTrace(error.Detail)); #line default #line hidden WriteLiteral("</pre>\r\n"); #line 77 "..\..\ErrorDetailPage.cshtml" } #line default #line hidden #line 83 "..\..\ErrorDetailPage.cshtml" #line default #line hidden WriteLiteral("\r\n<p id=\"ErrorLogTime\">"); #line 85 "..\..\ErrorDetailPage.cshtml" Write(string.Format( @"Logged on {0} at {1}", error.Time.ToLongDateString(), error.Time.ToLongTimeString())); #line default #line hidden WriteLiteral("</p>\r\n\r\n"); WriteLiteral("\r\n\r\n<p>See also:</p>\r\n\r\n<ul>\r\n\r\n"); WriteLiteral("\r\n\r\n"); #line 105 "..\..\ErrorDetailPage.cshtml" if (error.WebHostHtmlMessage.Length != 0) { var htmlUrl = basePageName + "/html?id=" + Uri.EscapeDataString(errorEntry.Id); #line default #line hidden WriteLiteral(" <li><a href=\""); #line 108 "..\..\ErrorDetailPage.cshtml" Write(basePageName); #line default #line hidden WriteLiteral("/html?id="); #line 108 "..\..\ErrorDetailPage.cshtml" Write(Uri.EscapeDataString(errorEntry.Id)); #line default #line hidden WriteLiteral("\">Original ASP.NET error page</a></li>\r\n"); #line 109 "..\..\ErrorDetailPage.cshtml" } #line default #line hidden #line 113 "..\..\ErrorDetailPage.cshtml" #line default #line hidden WriteLiteral("\r\n <li>Raw/Source data in \r\n <a rel=\""); #line 116 "..\..\ErrorDetailPage.cshtml" Write(HtmlLinkType.Alternate); #line default #line hidden WriteLiteral("\" \r\n type=\"application/xml\" \r\n href=\"xml"); #line 118 "..\..\ErrorDetailPage.cshtml" Write(Request.Url.Query); #line default #line hidden WriteLiteral("\">XML</a>\r\n or in\r\n <a rel=\""); #line 120 "..\..\ErrorDetailPage.cshtml" Write(HtmlLinkType.Alternate); #line default #line hidden WriteLiteral("\" \r\n type=\"application/json\" \r\n href=\"json"); #line 122 "..\..\ErrorDetailPage.cshtml" Write(Request.Url.Query); #line default #line hidden WriteLiteral("\">JSON</a>\r\n </li>\r\n</ul>\r\n\r\n"); WriteLiteral("\r\n\r\n"); #line 140 "..\..\ErrorDetailPage.cshtml" var collection = new { Data = error.ServerVariables, Id = "ServerVariables", Title = "Server Variables", }; // // If the collection isn't there or it's empty, then bail out. // if (collection.Data != null && collection.Data.Count > 0) { var items = from i in Enumerable.Range(0, collection.Data.Count) select new { Index = i, Key = collection.Data.GetKey(i), Value = collection.Data[i], }; items = items.OrderBy(e => e.Key, StringComparer.OrdinalIgnoreCase); #line default #line hidden WriteLiteral(" <div id=\""); #line 165 "..\..\ErrorDetailPage.cshtml" Write(collection.Id); #line default #line hidden WriteLiteral("\">\r\n\r\n <h2>"); #line 167 "..\..\ErrorDetailPage.cshtml" Write(collection.Title); #line default #line hidden WriteLiteral("</h2>\r\n "); WriteLiteral(@" <div class=""scroll-view""> <table cellspacing=""0"" style=""border-collapse:collapse;"" class=""table table-condensed table-striped""> <tr> <th class=""name-col"" style=""white-space:nowrap;"">Name</th> <th class=""value-col"" style=""white-space:nowrap;"">Value</th> </tr> "); #line 183 "..\..\ErrorDetailPage.cshtml" foreach (var item in items) { #line default #line hidden WriteLiteral(" <tr class=\""); #line 185 "..\..\ErrorDetailPage.cshtml" Write(item.Index % 2 == 0 ? "even" : "odd"); #line default #line hidden WriteLiteral("\">\r\n <td class=\"key-col\">"); #line 186 "..\..\ErrorDetailPage.cshtml" Write(item.Key); #line default #line hidden WriteLiteral("</td>\r\n <td class=\"value-col\">"); #line 187 "..\..\ErrorDetailPage.cshtml" Write(item.Value); #line default #line hidden WriteLiteral("</td>\r\n </tr>\r\n"); #line 189 "..\..\ErrorDetailPage.cshtml" } #line default #line hidden WriteLiteral("\r\n </table>\r\n </div>\r\n </div>\r\n"); #line 194 "..\..\ErrorDetailPage.cshtml" } #line default #line hidden WriteLiteral("\r\n"); WriteLiteral("\r\n"); }
/// <summary> /// Initializes a new instance of the /// <see cref="ErrorLogDataSourceAdapter"/> class with the default /// error log implementation. /// </summary> public ErrorLogDataSourceAdapter() { _log = ErrorLog.GetDefault(HttpContext.Current); }
public override void Execute() { WriteLiteral("\r\n"); #line 8 "..\..\ErrorLogPage.cshtml" const int defaultPageSize = 15; const int maximumPageSize = 100; var basePageName = Request.ServerVariables["URL"]; // // Get the page index and size parameters within their bounds. // var pageSize = Convert.ToInt32(Request.QueryString["size"], CultureInfo.InvariantCulture); pageSize = Math.Min(maximumPageSize, Math.Max(0, pageSize)); if (pageSize == 0) { pageSize = defaultPageSize; } var pageIndex = Convert.ToInt32(Request.QueryString["page"], CultureInfo.InvariantCulture); pageIndex = Math.Max(1, pageIndex) - 1; // // Read the error records. // var log = this.ErrorLog ?? ErrorLog.GetDefault(Context); var errorEntryList = new List <ErrorLogEntry>(pageSize); var totalCount = log.GetErrors(pageIndex, pageSize, errorEntryList); // // Set the title of the page. // var hostName = Environment.MachineName; var title = string.Format(@"Error log for {0} on {1} (Page #{2})", log.ApplicationName, hostName, (pageIndex + 1).ToString("N0")); Layout = new Elmah.MasterPage { Context = Context, /* TODO Consider not requiring this */ Title = title, Footnote = string.Format("This log is provided by the {0}.", log.Name), SpeedBarItems = new[] { SpeedBar.RssFeed.Format(basePageName), SpeedBar.RssDigestFeed.Format(basePageName), SpeedBar.DownloadLog.Format(basePageName), SpeedBar.Help, SpeedBar.About.Format(basePageName), }, }; // If the application name matches the APPL_MD_PATH then its // of the form /LM/W3SVC/.../<name>. In this case, use only the // <name> part to reduce the noise. The full application name is // still made available through a tooltip. var simpleName = log.ApplicationName; if (string.Compare(simpleName, Request.ServerVariables["APPL_MD_PATH"], true, CultureInfo.InvariantCulture) == 0) { var lastSlashIndex = simpleName.LastIndexOf('/'); if (lastSlashIndex > 0) { simpleName = simpleName.Substring(lastSlashIndex + 1); } } #line default #line hidden WriteLiteral(" <h1 id=\"PageTitle\">\r\n Error Log for <span id=\"ApplicationName\"" + " title=\""); #line 80 "..\..\ErrorLogPage.cshtml" Write(log.ApplicationName); #line default #line hidden WriteLiteral("\">"); #line 80 "..\..\ErrorLogPage.cshtml" Write(simpleName); #line default #line hidden WriteLiteral(" on "); #line 80 "..\..\ErrorLogPage.cshtml" Write(hostName); #line default #line hidden WriteLiteral("</span>\r\n </h1>\r\n \r\n"); #line 83 "..\..\ErrorLogPage.cshtml" if (errorEntryList.Count > 0) { // Write error number range displayed on this page and the // total available in the log, followed by stock // page sizes. var firstErrorNumber = pageIndex * pageSize + 1; var lastErrorNumber = firstErrorNumber + errorEntryList.Count - 1; var totalPages = (int)Math.Ceiling((double)totalCount / pageSize); // Write out a set of stock page size choices. Note that // selecting a stock page size re-starts the log // display from the first page to get the right paging. var stockSizes = from sizes in new[] { new[] { 10, 15, 20, 25, 30, 50, 100, }, } from size in sizes.Index() let separator = size.Key + 1 == sizes.Length ? null : size.Key + 2 == sizes.Length ? " or " : ", " select LinkHere(basePageName, HtmlLinkType.Start, size.Value.ToString("N0"), 0, size.Value) + separator; #line default #line hidden WriteLiteral(" <p>Errors "); #line 112 "..\..\ErrorLogPage.cshtml" Write(firstErrorNumber.ToString("N0")); #line default #line hidden WriteLiteral(" to "); #line 112 "..\..\ErrorLogPage.cshtml" Write(lastErrorNumber.ToString("N0")); #line default #line hidden WriteLiteral(" \r\n of total "); #line 113 "..\..\ErrorLogPage.cshtml" Write(totalCount.ToString("N0")); #line default #line hidden WriteLiteral(" \r\n (page "); #line 114 "..\..\ErrorLogPage.cshtml" Write((pageIndex + 1).ToString("N0")); #line default #line hidden WriteLiteral(" of "); #line 114 "..\..\ErrorLogPage.cshtml" Write(totalPages.ToString("N0")); #line default #line hidden WriteLiteral("). \r\n Start with "); #line 115 "..\..\ErrorLogPage.cshtml" Write(Html(stockSizes.ToDelimitedString(string.Empty))); #line default #line hidden WriteLiteral(" errors per page.</p>\r\n"); #line 116 "..\..\ErrorLogPage.cshtml" // Write out the main table to display the errors. #line default #line hidden WriteLiteral(@" <table id=""ErrorLog"" cellspacing=""0"" style=""border-collapse:collapse;"" class=""table table-condensed table-striped""> <tr> <th class=""host-col"" style=""white-space:nowrap;"">Host</th> <th class=""code-col"" style=""white-space:nowrap;"">Code</th> <th class=""type-col"" style=""white-space:nowrap;"">Type</th> <th class=""error-col"" style=""white-space:nowrap;"">Error</th> <th class=""user-col"" style=""white-space:nowrap;"">User</th> <th class=""time-col"" style=""white-space:nowrap;"">When</th> </tr> "); #line 129 "..\..\ErrorLogPage.cshtml" foreach (var error in from item in errorEntryList.Index() let e = item.Value.Error select new { Index = item.Key, item.Value.Id, e.HostName, e.StatusCode, StatusDescription = e.StatusCode > 0 ? HttpStatus.FromCode(e.StatusCode).Reason : null, e.Type, HumaneType = ErrorDisplay.HumaneExceptionErrorType(e), e.Message, e.User, When = FuzzyTime.FormatInEnglish(e.Time), Iso8601Time = e.Time.ToString("o"), }) { #line default #line hidden WriteLiteral(" <tr class=\""); #line 149 "..\..\ErrorLogPage.cshtml" Write(error.Index % 2 == 0 ? "even" : "odd"); #line default #line hidden WriteLiteral("\">\r\n \r\n <td class=\"host-col\" style=\"white-s" + "pace:nowrap;\">"); #line 151 "..\..\ErrorLogPage.cshtml" Write(error.HostName); #line default #line hidden WriteLiteral("</td>\r\n <td class=\"code-col\" style=\"white-space:nowrap;\">\r\n"); #line 153 "..\..\ErrorLogPage.cshtml" if (!string.IsNullOrEmpty(error.StatusDescription)) { #line default #line hidden WriteLiteral(" <span title=\""); #line 155 "..\..\ErrorLogPage.cshtml" Write(error.StatusDescription); #line default #line hidden WriteLiteral("\">"); #line 155 "..\..\ErrorLogPage.cshtml" Write(error.StatusCode); #line default #line hidden WriteLiteral("</span>\r\n"); #line 156 "..\..\ErrorLogPage.cshtml" } else if (error.StatusCode != 0) { #line default #line hidden #line 159 "..\..\ErrorLogPage.cshtml" Write(error.StatusCode); #line default #line hidden #line 159 "..\..\ErrorLogPage.cshtml" } #line default #line hidden WriteLiteral(" </td>\r\n <td class=\"type-col\" style=\"white-" + "space:nowrap;\"><span title=\""); #line 162 "..\..\ErrorLogPage.cshtml" Write(error.Type); #line default #line hidden WriteLiteral("\">"); #line 162 "..\..\ErrorLogPage.cshtml" Write(error.HumaneType); #line default #line hidden WriteLiteral("</span></td>\r\n \r\n <td class=\"error-col\"><sp" + "an>"); #line 164 "..\..\ErrorLogPage.cshtml" Write(error.Message); #line default #line hidden WriteLiteral("</span> \r\n <a href=\""); #line 165 "..\..\ErrorLogPage.cshtml" Write(basePageName); #line default #line hidden WriteLiteral("/detail?id="); #line 165 "..\..\ErrorLogPage.cshtml" Write(error.Id); #line default #line hidden WriteLiteral("\">Details…</a></td>\r\n \r\n <td class=\"" + "user-col\" style=\"white-space:nowrap;\">"); #line 167 "..\..\ErrorLogPage.cshtml" Write(error.User); #line default #line hidden WriteLiteral("</td>\r\n <td class=\"time-col\" style=\"white-space:nowrap;\"><abbr" + " title=\""); #line 168 "..\..\ErrorLogPage.cshtml" Write(error.Iso8601Time); #line default #line hidden WriteLiteral("\">"); #line 168 "..\..\ErrorLogPage.cshtml" Write(error.When); #line default #line hidden WriteLiteral("</abbr></td>\r\n </tr>\r\n"); #line 170 "..\..\ErrorLogPage.cshtml" } #line default #line hidden WriteLiteral(" </table>\r\n"); #line 172 "..\..\ErrorLogPage.cshtml" // Write out page navigation links. // // If not on the last page then render a link to the next page. // var nextPageIndex = pageIndex + 1; var moreErrors = nextPageIndex * pageSize < totalCount; #line default #line hidden WriteLiteral(" <p>\r\n\r\n"); #line 184 "..\..\ErrorLogPage.cshtml" if (moreErrors) { #line default #line hidden #line 186 "..\..\ErrorLogPage.cshtml" Write(LinkHere(basePageName, HtmlLinkType.Next, "Next errors", nextPageIndex, pageSize)); #line default #line hidden #line 186 "..\..\ErrorLogPage.cshtml" } #line default #line hidden #line 188 "..\..\ErrorLogPage.cshtml" if (pageIndex > 0 && totalCount > 0) { if (moreErrors) { Write("; "); } #line default #line hidden #line 193 "..\..\ErrorLogPage.cshtml" Write(LinkHere(basePageName, HtmlLinkType.Start, "Back to first page", 0, pageSize)); #line default #line hidden #line 193 "..\..\ErrorLogPage.cshtml" } #line default #line hidden WriteLiteral("\r\n </p>\r\n"); #line 197 "..\..\ErrorLogPage.cshtml" } else { // No errors found in the log, so display a corresponding // message. // It is possible that there are no error at the requested // page in the log (especially if it is not the first page). // However, if there are error in the log if (pageIndex > 0 && totalCount > 0) { #line default #line hidden WriteLiteral(" <p>"); #line 209 "..\..\ErrorLogPage.cshtml" Write(LinkHere(basePageName, HtmlLinkType.Start, "Go to first page", 0, pageSize)); #line default #line hidden WriteLiteral(".</p>\r\n"); #line 210 "..\..\ErrorLogPage.cshtml" } else { #line default #line hidden WriteLiteral(" <p>No errors found.</p>\r\n"); #line 214 "..\..\ErrorLogPage.cshtml" } } #line default #line hidden WriteLiteral("\r\n"); WriteLiteral("\r\n"); }
private void Render() { Response.ContentType = "application/xml"; ErrorLog log = ErrorLog.GetDefault(_context); // // We'll be emitting RSS vesion 0.91. // RichSiteSummary rss = new RichSiteSummary(); rss.version = "0.91"; // // Set up the RSS channel. // Channel channel = new Channel(); string hostName = Environment.TryGetMachineName(_context); channel.title = "Daily digest of errors in " + log.ApplicationName + (hostName.Length > 0 ? " on " + hostName : null); channel.description = "Daily digest of application errors"; channel.language = "en"; Uri baseUrl = new Uri(ErrorLogPageFactory.GetRequestUrl(_context).GetLeftPart(UriPartial.Authority) + Request.ServerVariables["URL"]); channel.link = baseUrl.ToString(); rss.channel = channel; // // Build the channel items. // const int pageSize = 30; const int maxPageLimit = 30; ArrayList itemList = new ArrayList(pageSize); ArrayList errorEntryList = new ArrayList(pageSize); // // Start with the first page of errors. // int pageIndex = 0; // // Initialize the running state. // DateTime runningDay = DateTime.MaxValue; int runningErrorCount = 0; Item item = null; StringBuilder sb = new StringBuilder(); HtmlTextWriter writer = new HtmlTextWriter(new StringWriter(sb)); do { // // Get a logical page of recent errors and loop through them. // errorEntryList.Clear(); log.GetErrors(pageIndex++, pageSize, errorEntryList); foreach (ErrorLogEntry entry in errorEntryList) { Error error = entry.Error; DateTime time = error.Time.ToUniversalTime(); DateTime day = new DateTime(time.Year, time.Month, time.Day); // // If we're dealing with a new day then break out to a // new channel item, finishing off the previous one. // if (day < runningDay) { if (runningErrorCount > 0) { RenderEnd(writer); item.description = sb.ToString(); itemList.Add(item); } runningDay = day; runningErrorCount = 0; if (itemList.Count == pageSize) { break; } item = new Item(); item.pubDate = time.ToString("r"); item.title = string.Format("Digest for {0} ({1})", runningDay.ToString("yyyy-MM-dd"), runningDay.ToLongDateString()); sb.Length = 0; RenderStart(writer); } RenderError(writer, entry, baseUrl); runningErrorCount++; } }while (pageIndex < maxPageLimit && itemList.Count < pageSize && errorEntryList.Count > 0); if (runningErrorCount > 0) { RenderEnd(writer); item.description = sb.ToString(); itemList.Add(item); } channel.item = (Item[])itemList.ToArray(typeof(Item)); // // Stream out the RSS XML. // Response.Write(XmlText.StripIllegalXmlCharacters(XmlSerializer.Serialize(rss))); }
private static IEnumerable <AsyncResultOr <string> > ProcessRequest(HttpContextBase context, Func <AsyncCallback> getAsyncCallback, Format format, int maxDownloadCount) { var response = context.Response; foreach (var text in format.Header()) { yield return(AsyncResultOr.Value(text)); } var log = ErrorLog.GetDefault(context); var lastBeatTime = DateTime.Now; var errorEntryList = new List <ErrorLogEntry>(_pageSize); var downloadCount = 0; for (var pageIndex = 0; ; pageIndex++) { var ar = log.BeginGetErrors(pageIndex, _pageSize, errorEntryList, getAsyncCallback(), null); yield return(ar.InsteadOf <string>()); var total = log.EndGetErrors(ar); var count = errorEntryList.Count; if (maxDownloadCount > 0) { var remaining = maxDownloadCount - (downloadCount + count); if (remaining < 0) { count += remaining; } } foreach (var entry in format.Entries(errorEntryList, 0, count, total)) { yield return(AsyncResultOr.Value(entry)); } downloadCount += count; response.Flush(); // // Done if either the end of the list (no more errors found) or // the requested limit has been reached. // if (count == 0 || downloadCount == maxDownloadCount) { if (count > 0) { foreach (var entry in format.Entries(new ErrorLogEntry[0], total)) // Terminator { yield return(AsyncResultOr.Value(entry)); } } break; } // // Poll whether the client is still connected so data is not // unnecessarily sent to an abandoned connection. This check is // only performed at certain intervals. // if (DateTime.Now - lastBeatTime > _beatPollInterval) { if (!response.IsClientConnected) { break; } lastBeatTime = DateTime.Now; } // // Fetch next page of results. // errorEntryList.Clear(); } }
private static async Task ProcessRequestAsync(HttpContextBase context, Format format, int maxDownloadCount) { var response = context.Response; var output = response.Output; foreach (var text in format.Header()) { await output.WriteAsync(text); } var log = ErrorLog.GetDefault(context); var errorEntryList = new List <ErrorLogEntry>(_pageSize); var downloadCount = 0; var clientDisconnectedToken = response.ClientDisconnectedToken; for (var pageIndex = 0; ; pageIndex++) { var total = await log.GetErrorsAsync(pageIndex, _pageSize, errorEntryList, clientDisconnectedToken); var count = errorEntryList.Count; if (maxDownloadCount > 0) { var remaining = maxDownloadCount - (downloadCount + count); if (remaining < 0) { count += remaining; } } foreach (var entry in format.Entries(errorEntryList, 0, count, total)) { await output.WriteAsync(entry); } downloadCount += count; await Task.Factory.FromAsync(response.BeginFlush, response.EndFlush, null); // // Done if either the end of the list (no more errors found) or // the requested limit has been reached. // if (count == 0 || downloadCount == maxDownloadCount) { if (count > 0) { foreach (var entry in format.Entries(new ErrorLogEntry[0], total)) // Terminator { await output.WriteAsync(entry); } } break; } if (clientDisconnectedToken.IsCancellationRequested) { break; } // // Fetch next page of results. // errorEntryList.Clear(); } }
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData) { if (context == null) { throw new ArgumentNullException("context"); } if (_result != null) { throw new InvalidOperationException("An asynchronous operation is already pending."); } HttpRequest request = context.Request; NameValueCollection query = request.QueryString; // // Limit the download by some maximum # of records? // _maxDownloadCount = Math.Max(0, Convert.ToInt32(query["limit"], CultureInfo.InvariantCulture)); // // Determine the desired output format. // string format = Mask.EmptyString(query["format"], "csv").ToLower(CultureInfo.InvariantCulture); switch (format) { case "csv": _format = new CsvFormat(context); break; case "jsonp": _format = new JsonPaddingFormat(context); break; case "html-jsonp": _format = new JsonPaddingFormat(context, /* wrapped */ true); break; default: throw new Exception("Request log format is not supported."); } Debug.Assert(_format != null); // // Emit format header, initialize and then fetch results. // context.Response.BufferOutput = false; _format.Header(); AsyncResult result = _result = new AsyncResult(extraData); _log = ErrorLog.GetDefault(context); _pageIndex = 0; _lastBeatTime = DateTime.Now; _context = context; _callback = cb; _errorEntryList = new List <ErrorLogEntry>(_pageSize); _log.BeginGetErrors(_pageIndex, _pageSize, _errorEntryList, new AsyncCallback(GetErrorsCallback), null); return(result); }
public override void Execute() { WriteLiteral("\r\n"); #line 7 "..\..\ErrorDetailPage.cshtml" var basePageName = Request.ServerVariables["URL"]; // // Retrieve the ID of the error to display and read it from // the store. // var errorId = Request.QueryString["id"] ?? string.Empty; if (errorId.Length == 0) { return; } var log = this.ErrorLog ?? ErrorLog.GetDefault(Context); var errorEntry = log.GetError(errorId); // // Perhaps the error has been deleted from the store? Whatever // the reason, bail out silently. // if (errorEntry == null) { Response.Status = HttpStatus.NotFound.ToString(); #line default #line hidden WriteLiteral(" <p>Error not found in log.</p>\r\n"); #line 34 "..\..\ErrorDetailPage.cshtml" return; } var title = string.Format("Error: {0} [{1}]", errorEntry.Error.Type, errorEntry.Id); Layout = new Elmah.MasterPage { Context = Context, /* TODO Consider not requiring this */ Title = title, Footnote = string.Format("This log is provided by the {0}.", log.Name), SpeedBarItems = new[] { SpeedBar.Home.Format(basePageName), SpeedBar.Help, SpeedBar.About.Format(basePageName), }, }; var error = errorEntry.Error; #line default #line hidden WriteLiteral("\r\n"); WriteLiteral("\r\n\r\n<h1 id=\"PageTitle\">"); #line 59 "..\..\ErrorDetailPage.cshtml" Write(error.Message); #line default #line hidden WriteLiteral("</h1>\r\n\r\n<p id=\"ErrorTitle\">"); WriteLiteral("<span id=\"ErrorType\">"); #line 62 "..\..\ErrorDetailPage.cshtml" Write(error.Type); #line default #line hidden WriteLiteral("</span>"); WriteLiteral("<span id=\"ErrorTypeMessageSeparator\">: </span>"); WriteLiteral("<span id=\"ErrorMessage\">"); #line 64 "..\..\ErrorDetailPage.cshtml" Write(error.Message); #line default #line hidden WriteLiteral("</span></p>\r\n\r\n"); WriteLiteral("\r\n\r\n"); #line 74 "..\..\ErrorDetailPage.cshtml" if (error.Detail.Length != 0) { #line default #line hidden WriteLiteral(" <pre id=\"ErrorDetail\">"); #line 76 "..\..\ErrorDetailPage.cshtml" Write(MarkupStackTrace(error.Detail)); #line default #line hidden WriteLiteral("</pre>\r\n"); #line 77 "..\..\ErrorDetailPage.cshtml" } #line default #line hidden #line 83 "..\..\ErrorDetailPage.cshtml" #line default #line hidden WriteLiteral("\r\n<p id=\"ErrorLogTime\">"); #line 85 "..\..\ErrorDetailPage.cshtml" Write(string.Format( @"Logged on {0} at {1}", error.Time.ToLongDateString(), error.Time.ToLongTimeString())); #line default #line hidden WriteLiteral("</p>\r\n\r\n"); WriteLiteral("\r\n\r\n<p>See also:</p>\r\n\r\n<ul>\r\n\r\n"); WriteLiteral("\r\n\r\n"); #line 105 "..\..\ErrorDetailPage.cshtml" if (error.WebHostHtmlMessage.Length != 0) { var htmlUrl = basePageName + "/html?id=" + Uri.EscapeDataString(errorEntry.Id); #line default #line hidden WriteLiteral(" <li><a href=\""); #line 108 "..\..\ErrorDetailPage.cshtml" Write(basePageName); #line default #line hidden WriteLiteral("/html?id="); #line 108 "..\..\ErrorDetailPage.cshtml" Write(Uri.EscapeDataString(errorEntry.Id)); #line default #line hidden WriteLiteral("\">Original ASP.NET error page</a></li>\r\n"); #line 109 "..\..\ErrorDetailPage.cshtml" } #line default #line hidden #line 113 "..\..\ErrorDetailPage.cshtml" #line default #line hidden WriteLiteral("\r\n <li>Raw/Source data in \r\n <a rel=\""); #line 116 "..\..\ErrorDetailPage.cshtml" Write(HtmlLinkType.Alternate); #line default #line hidden WriteLiteral("\" \r\n type=\"application/xml\" \r\n href=\"xml"); #line 118 "..\..\ErrorDetailPage.cshtml" Write(Request.Url.Query); #line default #line hidden WriteLiteral("\">XML</a>\r\n or in\r\n <a rel=\""); #line 120 "..\..\ErrorDetailPage.cshtml" Write(HtmlLinkType.Alternate); #line default #line hidden WriteLiteral("\" \r\n type=\"application/json\" \r\n href=\"json"); #line 122 "..\..\ErrorDetailPage.cshtml" Write(Request.Url.Query); #line default #line hidden WriteLiteral("\">JSON</a>\r\n </li>\r\n</ul>\r\n\r\n"); #line 126 "..\..\ErrorDetailPage.cshtml" if (error.UserComments.Length != 0) { #line default #line hidden WriteLiteral(" <div id=\"UserComments\">\r\n <h2>User Comments</h2>\r\n </div>\r\n"); WriteLiteral(" <pre>"); #line 131 "..\..\ErrorDetailPage.cshtml" Write(error.UserComments); #line default #line hidden WriteLiteral("</pre>\r\n"); #line 132 "..\..\ErrorDetailPage.cshtml" } #line default #line hidden WriteLiteral("\r\n"); #line 134 "..\..\ErrorDetailPage.cshtml" #line default #line hidden #line 135 "..\..\ErrorDetailPage.cshtml" Write(MarkupCollection(error.ServerVariables, "ServerVariables", "Server Variables")); #line default #line hidden #line 135 "..\..\ErrorDetailPage.cshtml" #line default #line hidden #line 136 "..\..\ErrorDetailPage.cshtml" Write(MarkupCollection(error.SessionVariables, "SessionVariables", "Session Variables")); #line default #line hidden #line 136 "..\..\ErrorDetailPage.cshtml" #line default #line hidden #line 137 "..\..\ErrorDetailPage.cshtml" Write(MarkupCollection(error.QueryString, "QueryString", "Query String")); #line default #line hidden #line 137 "..\..\ErrorDetailPage.cshtml" #line default #line hidden #line 138 "..\..\ErrorDetailPage.cshtml" Write(MarkupCollection(error.Cookies, "Cookies", "Cookies")); #line default #line hidden #line 138 "..\..\ErrorDetailPage.cshtml" #line default #line hidden WriteLiteral("\r\n"); WriteLiteral("\r\n"); }