在 ASP.NET MVC 4 应用程序中安装 Elmah 的异常处理

本文关键字:安装 Elmah 异常处理 应用程序 ASP NET MVC | 更新日期: 2023-09-27 17:56:44

我已经建立了一个很好的MVC4应用程序,决定保护它,一切都很好。下面是我用来帮助防止 XSS 攻击的过滤器作为示例。

public class IsPostedFromThisSiteAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        //TODO: - Possible problems in future:
        //1. Is there a way to handle the execptions and just display a friendly error page / message.
        if (filterContext.HttpContext != null)
        {
            if (filterContext.HttpContext.Request.UrlReferrer == null)
                throw new System.Web.HttpException("Invalid Submission");
            //if (filterContext.HttpContext.Request.UrlReferrer.Host != "localhost/YeatsClinical.PatientPortal.Web")
            if (filterContext.HttpContext.Request.UrlReferrer.AbsolutePath != ConfigurationManager.AppSettings["SiteURL"])
                throw new System.Web.HttpException("This form was not submitted from this site!");
        }
    }
}

我的MVC应用程序安装了Elmah,效果也很好。

问题是,我知道上面的错误,我不想显示异常消息,或记录它或类似的东西(所有这些都可以轻松完成)。相反,我想通过向我的用户显示一条漂亮的小消息来正确处理它。我如何更改上面的代码以允许它显示带有漂亮小消息的视图或部分视图,或者只是在某处输出一些文本,让用户以一种不会导致应用程序崩溃的好方式知道出了什么问题,也许在这种特殊情况下,将他返回到正确的登录屏幕。

在 ASP.NET MVC 4 应用程序中安装 Elmah 的异常处理

只需在filterContext上分配Result属性:

public class IsPostedFromThisSiteAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        //TODO: - Possible problems in future:
        //1. Is there a way to handle the execptions and just display a friendly error page / message.
        if (filterContext.HttpContext != null)
        {
            if (filterContext.HttpContext.Request.UrlReferrer == null)
            {
                var viewResult = new ViewResult
                {
                    ViewName = "~/Views/Shared/Invalid.cshtml"
                };
                filterContext.Result = viewResult;
                return;
            }
            if (filterContext.HttpContext.Request.UrlReferrer.AbsolutePath != ConfigurationManager.AppSettings["SiteURL"])
            {
                var viewResult = new ViewResult
                {
                    ViewName = "~/Views/Shared/InvalidSite.cshtml"
                };
                filterContext.Result = viewResult;
                return;
            }
        }
    }
}

这将阻止执行控制器操作,并将立即执行您分配给filterContextResult 属性的ActionResult。基本上,您正在缩短操作的执行。您可以返回所需的任何操作结果:ViewResult,PartialViewResult,JsonResult,RedirectToRouteResult,...