您现在的位置:澳门网上真人龙虎 > 菲律宾申博官方网址 > 现金十点半博彩 out exceptionToReplace);errorModel = new HandleError

现金十点半博彩 out exceptionToReplace);errorModel = new HandleError

2019-08-16 01:09

当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)); } } }