/// <summary> /// Called when an unhandled <see cref="ControllerActionException"/> is thrown. /// /// The default implementation will write a simple HTML response describing the error. /// </summary> /// <param name="e">The exception that was thrown.</param> protected virtual void OnUnhandledException(ControllerActionException e) { Response.StatusCode = (int)e.StatusCode; var title = $"{(int) e.StatusCode}: {e.StatusCode}"; OnServiceHtml(new html { new head { new title { title } }, new body { new h2 { title }, "Request:", nbsp, new code { Request.Url.ToString() }, br, "Message:", nbsp, new code { e.Message }, br, If((int)e.StatusCode >= 500 && (int)e.StatusCode < 600 && e.InnerException != null, new code(style => "padding:8px;white-space:pre-wrap;display:block;") { e.ToString() } ) } }); }
public bool TryInvokeAction(Controller controller, HttpListenerRequest request) { var prefixMatch = controller.ControllerMatcher.Match(request.Url); Debug.Assert(prefixMatch.Success); ControllerActionException exception = null; for (var i = _actions.Count - 1; i >= 0; --i) { var bound = _actions[i]; if (!IsMatchingHttpMethod(bound.HttpMethod, controller.HttpMethod)) { continue; } var match = bound.Matcher.Match(request.Url, prefixMatch.EndIndex); if (!match.Success) { continue; } if (bound.MatchAllUrl && !IsMatchingAllUrl(match, request.Url)) { continue; } try { controller.SetMatchedActionUrl(bound.Matcher, match); bound.Action(controller); return(true); } catch (ControllerActionException e) { if (e.RequestHandled) { throw; } if (exception == null) { exception = e; } } } if (exception != null) { throw exception; } return(false); }