コード例 #1
0
        /// <summary>
        /// Handle the error code
        /// </summary>
        /// <param name="statusCode">Status code</param>
        /// <param name="context">The <see cref="NancyContext"/> instance of the current request.</param>
        /// <returns>Nancy Response</returns>
        public void Handle(HttpStatusCode statusCode, NancyContext context)
        {
            if (context.Response != null && context.Response.Contents != null && !ReferenceEquals(context.Response.Contents, Response.NoBody))
            {
                return;
            }

            if (!this.errorMessages.ContainsKey(statusCode) || !this.errorPages.ContainsKey(statusCode))
            {
                return;
            }

            var result = new DefaultStatusCodeHandlerResult(statusCode, this.errorMessages[statusCode], StaticConfiguration.DisableErrorTraces ? DisableErrorTracesTrueMessage : context.GetExceptionDetails());
            try
            {
                context.Response = this.responseNegotiator.NegotiateResponse(result, context);
                context.Response.StatusCode = statusCode;
                return;
            }
            catch (ViewNotFoundException)
            {
                // No view will be found for `DefaultStatusCodeHandlerResult`
                // because it is rendered from embedded resources below
            }

            this.ModifyResponse(statusCode, context, result);
        }
コード例 #2
0
        /// <summary>
        /// Handle the status code.
        /// </summary>
        /// <param name="statusCode">The status code to handle</param>
        /// <param name="context">The current context</param>
        public void Handle(HttpStatusCode statusCode, NancyContext context)
        {
            if (context.Response?.Contents != null && !ReferenceEquals(context.Response.Contents, Response.NoBody))
            {
                return;
            }
            if (!_checks.ContainsKey((int)statusCode))
            {
                return;
            }

            Exception ex;
            dynamic   result = new ExpandoObject();

            if (context.TryGetException(out ex))
            {
                result.Type       = context.GetException().GetType();
                result.Message    = _checks[(int)statusCode];
                result.StackTrace = context.GetExceptionDetails();
                result.Target     = $"{context.GetException().TargetSite.Module}.{context.GetException().TargetSite.Name}";
            }
            else
            {
                result.Type       = statusCode;
                result.Message    = _checks[(int)statusCode];
                result.StackTrace = "";
                result.Target     = "";
            }

            try
            {
                context.Response            = _responseNegotiator.NegotiateResponse(result, context);
                context.Response.StatusCode = statusCode;
                return;
            }
            catch (Exception)
            {
                // Move on to HTML view
            }
            // Wrap the exception in an HTML <pre> tag
            result.StackTrace = string.Concat("<pre>", context.GetExceptionDetails().Replace("<", "&gt;").Replace(">", "&lt;"), "</pre>");
            result.StatusCode = statusCode;
            var response = _viewRenderer.RenderView(context, "views/errors/" + (int)statusCode + ".html", result);

            response.StatusCode = statusCode;
            context.Response    = response;
        }
コード例 #3
0
        /// <summary>
        /// Handle the error code
        /// </summary>
        /// <param name="statusCode">Status code</param>
        /// <param name="context">The <see cref="NancyContext"/> instance of the current request.</param>
        /// <returns>Nancy Response</returns>
        public void Handle(HttpStatusCode statusCode, NancyContext context)
        {
            if (context.Response != null && context.Response.Contents != null && !ReferenceEquals(context.Response.Contents, Response.NoBody))
            {
                return;
            }

            if (!this.errorMessages.ContainsKey(statusCode) || !this.errorPages.ContainsKey(statusCode))
            {
                return;
            }

            Response existingResponse = null;

            if (context.Response != null)
            {
                existingResponse = context.Response;
            }

            // Reset negotiation context to avoid any downstream cast exceptions
            // from swapping a view model with a `DefaultStatusCodeHandlerResult`
            context.NegotiationContext = new NegotiationContext();

            var details = !this.configuration.DisplayErrorTraces
                ? DisplayErrorTracesFalseMessage
                : string.Concat("<pre>", context.GetExceptionDetails().Replace("<", "&gt;").Replace(">", "&lt;"), "</pre>");

            var result = new DefaultStatusCodeHandlerResult
            {
                Details    = details,
                Message    = this.errorMessages[statusCode],
                StatusCode = statusCode
            };

            try
            {
                context.Response            = this.responseNegotiator.NegotiateResponse(result, context);
                context.Response.StatusCode = statusCode;

                if (existingResponse != null)
                {
                    context.Response.ReasonPhrase = existingResponse.ReasonPhrase;
                }
                return;
            }
            catch (ViewNotFoundException)
            {
                // No view will be found for `DefaultStatusCodeHandlerResult`
                // because it is rendered from embedded resources below
            }

            this.ModifyResponse(statusCode, context, result);
        }
コード例 #4
0
ファイル: StatusCodeHandler.cs プロジェクト: loftum/nancydemo
        private Response GetResponse(HttpStatusCode statusCode, NancyContext context)
        {
            var responseInfo = new ResponseInfo
            {
                StatusCode = (int)statusCode,
                Message    = statusCode.ToString(),
                Reason     = StaticConfiguration.DisableErrorTraces ? null : context.GetExceptionDetails()
            };
            var nonHtmlResponse = TryProcessNonHtml(responseInfo, context);

            if (nonHtmlResponse != null)
            {
                return(nonHtmlResponse);
            }
            var viewName = ((int)statusCode).ToString(CultureInfo.InvariantCulture);
            var response = _viewRenderer.RenderView(context, viewName);

            return(response);
        }
コード例 #5
0
        /// <summary>
        /// Handle the error code
        /// </summary>
        /// <param name="statusCode">Status code</param>
        /// <param name="context">The <see cref="NancyContext"/> instance of the current request.</param>
        /// <returns>Nancy Response</returns>
        public void Handle(HttpStatusCode statusCode, NancyContext context)
        {
            if (context.Response != null && context.Response.Contents != null && !ReferenceEquals(context.Response.Contents, Response.NoBody))
            {
                return;
            }

            if (!this.errorMessages.ContainsKey(statusCode) || !this.errorPages.ContainsKey(statusCode))
            {
                return;
            }

            Response existingResponse = null;

            if (context.Response != null)
            {
                existingResponse = context.Response;
            }

            // Reset negotiation context to avoid any downstream cast exceptions
            // from swapping a view model with a `DefaultStatusCodeHandlerResult`
            context.NegotiationContext = new NegotiationContext();

            var result = new DefaultStatusCodeHandlerResult(statusCode, this.errorMessages[statusCode], StaticConfiguration.DisableErrorTraces ? DisableErrorTracesTrueMessage : context.GetExceptionDetails());
            try
            {
                context.Response = this.responseNegotiator.NegotiateResponse(result, context);
                context.Response.StatusCode = statusCode;

                if (existingResponse != null)
                {
                    context.Response.ReasonPhrase = existingResponse.ReasonPhrase;
                }
                return;
            }
            catch (ViewNotFoundException)
            {
                // No view will be found for `DefaultStatusCodeHandlerResult`
                // because it is rendered from embedded resources below
            }

            this.ModifyResponse(statusCode, context, result);
        }
コード例 #6
0
 private static string PopulateErrorInfo(HttpStatusCode httpStatusCode, NancyContext context, string templateContents)
 {
     return(templateContents.Replace("[DETAILS]", StaticConfiguration.DisableErrorTraces ? String.Empty : context.GetExceptionDetails()));
 }
コード例 #7
0
 private static string PopulateErrorInfo(HttpStatusCode httpStatusCode, NancyContext context, string templateContents)
 {
     return templateContents.Replace("[DETAILS]", StaticConfiguration.DisableErrorTraces ? DisableErrorTracesTrueMessage : context.GetExceptionDetails());
 }
コード例 #8
0
        /// <summary>
        /// Handle the error code
        /// </summary>
        /// <param name="statusCode">Status code</param>
        /// <param name="context">The <see cref="NancyContext"/> instance of the current request.</param>
        /// <returns>Nancy Response</returns>
        public void Handle(HttpStatusCode statusCode, NancyContext context)
        {
            if (context.Response != null && context.Response.Contents != null && !ReferenceEquals(context.Response.Contents, Response.NoBody))
            {
                return;
            }

            if (!this.errorMessages.ContainsKey(statusCode) || !this.errorPages.ContainsKey(statusCode))
            {
                return;
            }

            var result = new DefaultStatusCodeHandlerResult(statusCode, this.errorMessages[statusCode], StaticConfiguration.DisableErrorTraces ? DisableErrorTracesTrueMessage : context.GetExceptionDetails());

            try
            {
                context.Response            = this.responseNegotiator.NegotiateResponse(result, context);
                context.Response.StatusCode = statusCode;
                return;
            }
            catch (ViewNotFoundException)
            {
                // No view will be found for `DefaultStatusCodeHandlerResult`
                // because it is rendered from embedded resources below
            }

            this.ModifyResponse(statusCode, context, result);
        }
コード例 #9
0
 public void Handle(HttpStatusCode statusCode, NancyContext context)
 {
     try
     {
         var response = _viewRenderer.RenderView(context, (_checks.Any(x => x == (int)statusCode) ? (int)statusCode : 500) + ".cshtml", context.GetExceptionDetails());
         response.StatusCode = statusCode;
         context.Response    = response;
     }
     catch (Exception)
     {
         RemoveCode((int)statusCode);
         context.Response.StatusCode = statusCode;
     }
 }