网上电玩城捕鱼

网上电玩城捕鱼

捕鱼电玩城技巧可以通过@model HandleErrorInfo 在Error.cshtml中定制显示异常信息

作者:apefpi 发布时间:2019-08-12 19:00

当ASP.NET MVC程序呈现了异常,怎样处理越发规范?

1. 最单一的方法是设置<customErrors/>节点

<customErrors>节点用于界说少许自界说谬误信休的信休。此节点有Mode和defaultRedirect两个属性,其中defaultRedirect属性是一个可选属性,外示应用程序爆发谬误时沉定向到的默认URL,若是没有指定该属性则显示普通性谬误。Mode属性是一个必选属性,它有三个可以值,它们所代外的事理分别如下: On 外示正在本地和长途用户城市看到自界说谬误信休。 Off 禁用自界说谬误信休,本地和长途用户城市看到具体的谬误信休。 RemoteOnly 外示本地用户将看到具体谬误信休,而长途用户将会看到自界说谬误信休。

这里有必要注明一下本地用户和长途用户的观点。当我们接见asp.net应用程时所运用的机械和公布asp.net应用程序所运用的机械为同一台机械时成为本地用户,反之则称之为长途用户。正在开发调试阶段为了便于查找谬误Mode属性倡议设置为Off,而正在部署阶段应将Mode属性设置为On或者 RemoteOnly,以预防这些具体的谬误信休露出了程序代码细节从而引来黑客的入侵。

<error>子节点

正在<customErrors>节点下还包括有<error>子节点,这个节点重要是根据服务器的HTTP谬误状态代码而沉定向到我们自界说的谬误页面,留神要使<error>子节点下的配置生效,必需将<customErrors>节点的Mode属性设置为“On”。下面是一个例子:

<customErrors mode="On" defaultRedirect="GenericErrorPage.htm"> <error statusCode="403" redirect="403.htm" /> <error statusCode="404" redirect="404.htm" /> </customErrors>

正在上面的配置中若是用户接见的页面不保存就会跳转到404.htm页面,若是用户没有权限接见央求的页面则会跳转到403.htm页面,403.htm和404.htm页面都是我们自己增多的页面,我们能够正在页面中给出友好的谬误提醒。

2. 运用过滤器HandleErrorAttribute

跟着ASP.NET MVC版本的更新,呈现了HandleErrorAttribute,运用Filter以AOP的思维实现了针关于Action的异常处理。运用此 Filter后,当程序中呈现异常的时分,会去封装这些异常信休,然后谈由主动转到该Controller对应的Error.cshtml中,若是此谈径下没有改文件,则会到shared目录中寻找此文件。另表一个相闭的是正在Global.asax中的protected void Application_Error[object sender, EventArgs e]方法,是捉拿异常的末了一起防线,也便是说,这是最高等次的异常捕获处理逻辑。运用HandleErrorAttribute后,找到了Error.cshtml,则此时异常曾经被捕获处理,以是不会再次被 Application_Error捕获处理。此表,能够通过@model HandleErrorInfo 正在Error.cshtml中定制显示异常信休。有一点需要留神的是,HandleErrorAttribute是正在customErrors根底之上的,若是想运用 HandleErrorAttribute,customErrors的Mode必需要设置为On或RemoteOnly. 否则,HandleErrorAttribute将不起作用。

3. 自界说显示谈径

若是遇到异常后不仅单是要自界说异常显示,而且还需要举行日志记录。此时,能够通过承继扩展HandleErrorAttribute来实现新的 Filter,然后正在lobal.ascx中对全体的Action举行注册,filters.Add(new MyHandleErrorAttribute()).正在这里具体注明一下另一种方式。我们能够写一个特地的Controller和Action来举行异常爆发时的谈由设置.

public class UtilityController : Controller { public ActionResult Error() { return View(); } public ActionResult PageNotFound() { return View(); } }

当呈现异常的时分,把异常扔到最顶端,由Application_Error统一处理。这里的统一处理就蕴含,记录日志,沉新举行页面定向等。

protected void Application_Error(object sender, EventArgs e) { var ex = Server.GetLastError(); Log.Error(ex); //记录日志信休 var httpStatusCode = (ex is HttpException) ? (ex as HttpException).GetHttpCode() : 500; //这里仅仅辨别两种谬误 var httpContext = ((MvcApplication)sender).Context; httpContext.ClearError(); httpContext.Response.Clear(); httpContext.Response.StatusCode = httpStatusCode; var shouldHandleException = true; HandleErrorInfo errorModel; var routeData = new RouteData(); routeData.Values["controller"] = "Utility"; switch (httpStatusCode) { case 404: routeData.Values["action"] = "PageNotFound"; errorModel = new HandleErrorInfo(new Exception(string.Format("No page Found", httpContext.Request.UrlReferrer), ex), "Utility", "PageNotFound"); break; default: routeData.Values["action"] = "Error"; Exception exceptionToReplace = null; //这里运用了EntLib的异常处理模块的少许功能 shouldHandleException = ExceptionPolicy.HandleException(ex, "LogAndReplace", out exceptionToReplace); errorModel = new HandleErrorInfo(exceptionToReplace, "Utility", "Error"); break; } if (shouldHandleException) { var controller = new UtilityController(); controller.ViewData.Model = errorModel; //通过代码谈由到指定的谈径 ((IController)controller).Execute(new RequestContext(new HttpContextWrapper(httpContext), routeData)); } } }