繁体   English   中英

如何在自定义HandleErrorAttribute中获取http状态代码

[英]How to get the http status code in custom HandleErrorAttribute

我正在使用自定义的HandleErrorAttribute,该属性通过在过滤器中注册来全局应用。 问题是,我找不到正确的http错误代码。 每次在该属性中包含200个代码。

public class HandleAndLogErrorAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled)
            return;
        var statusCode = filterContext.HttpContext.Response.StatusCode; //always 200
        LogManager.Error(filterContext.Exception);

        filterContext.Result = CreateActionResult(filterContext, statusCode);
        filterContext.ExceptionHandled = true;
        filterContext.HttpContext.Response.Clear();
        filterContext.HttpContext.Response.StatusCode = statusCode;
        //filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
    }

    protected virtual ActionResult CreateActionResult(ExceptionContext filterContext, int statusCode)
    {
        var ctx = new ControllerContext(filterContext.RequestContext, filterContext.Controller);
        var statusCodeName = ((HttpStatusCode)statusCode).ToString();
        var viewName = "~/Views/Shared/Error.cshtml";
        var controllerName = (string)filterContext.RouteData.Values["controller"];
        var actionName = (string)filterContext.RouteData.Values["action"];
        var model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
        var result = new ViewResult
        {
            ViewName = viewName,
            ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
        };
        result.ViewBag.StatusCode = statusCode;
        return result;
    }
}

浏览HandleErrorAttribute.cs的源代码,看起来您可以使用以下代码来获取状态代码。

var statusCode = new HttpException(null, filterContext.Exception).GetHttpCode();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM