返回顶部
首页 > 资讯 > 后端开发 > ASP.NET >ASP.NET MVC自定义异常过滤器使用案例
  • 236
分享到

ASP.NET MVC自定义异常过滤器使用案例

2024-04-02 19:04:59 236人浏览 泡泡鱼
摘要

目录一、需求二、案例1、创建工具类1.1、创建日志工具类1.2、创建网络工具类2、创建自定义异常类3、创建控制器4、测试在上一篇文章中讲解了自定义异常过滤器,这篇文章会结合工作中的真

在上一篇文章中讲解了自定义异常过滤器,这篇文章会结合工作中的真实案例讲解一下如何使用自定义异常过滤器。

一、需求

本案例要实现的功能需求:在发生异常时记录日志,日志内容包括发生异常的Controller名称、Action名称、使用浏览器类型和版本等。

二、案例

1、创建工具类

首先创建项目中需要使用的工具类。

1.1、创建日志工具类

在案例中使用Log4net来记录日志。首先要添加对Log4net的引用,直接在NuGet里面搜索Log4net,然后安装即可。

日志消息实体类代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.WEB;

namespace mvcCuetomerExcepFilterDemo.Models
{
    /// <summary>
    /// 日志消息实体类
    /// </summary>
    public class LogMessageEntity
    {
        /// <summary>
        /// 操作时间
        /// </summary>
        public DateTime OperationTime { get; set; }
        /// <summary>
        /// Url地址
        /// </summary>
        public string Url { get; set; }
        /// <summary>
        /// 类名
        /// </summary>
        public string Class { get; set; }
        /// <summary>
        /// IP
        /// </summary>
        public string Ip { get; set; }
        /// <summary>
        /// 主机
        /// </summary>
        public string Host { get; set; }
        /// <summary>
        /// 浏览器
        /// </summary>
        public string Browser { get; set; }
        /// <summary>
        /// 操作人
        /// </summary>
        public string UserName { get; set; }
        /// <summary>
        /// 内容
        /// </summary>
        public string Content { get; set; }

        /// <summary>
        /// 异常信息
        /// </summary>
        public string ExceptionInfo { get; set; }
        /// <summary>
        /// 异常来源
        /// </summary>
        public string ExceptionSource { get; set; }
        /// <summary>
        /// 异常信息备注
        /// </summary>
        public string ExceptionRemark { get; set; }
    }
}

创建日志级别枚举类型,分别对应Log4net中的日志级别,代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Web;

namespace MVCCuetomerExcepFilterDemo.Models.Enums
{
    /// <summary>
    /// 日志级别
    /// </summary>
    public enum LogLevel
    {
        /// <summary>
        /// 错误
        /// </summary>
        [Description("错误")]
        Error,
        /// <summary>
        /// 警告
        /// </summary>
        [Description("警告")]
        Warning,
        /// <summary>
        /// 信息
        /// </summary>
        [Description("信息")]
        Info,
        /// <summary>
        /// 调试
        /// </summary>
        [Description("调试")]
        Debug
    }
}

创建一个对日志格式进行格式化的类,代码如下:

using MVCCuetomerExcepFilterDemo.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;

namespace MVCCuetomerExcepFilterDemo.Util
{
    /// <summary>
    /// 日志格式器
    /// </summary>
    public class LogFORMat
    {
        /// <summary>
        /// 生成错误
        /// </summary>
        /// <param name="logMessage">对象</param>
        /// <returns></returns>
        public string ErrorFormat(LogMessageEntity logMessage)
        {
            StringBuilder strInfo = new StringBuilder();
            strInfo.Append("1. 错误: >> 操作时间: " + logMessage.OperationTime + "   操作人: " + logMessage.UserName + " \r\n");
            strInfo.Append("2. 地址: " + logMessage.Url + "    \r\n");
            strInfo.Append("3. 类名: " + logMessage.Class + " \r\n");
            strInfo.Append("4. Ip  : " + logMessage.Ip + "   主机: " + logMessage.Host + "   浏览器: " + logMessage.Browser + "    \r\n");
            strInfo.Append("5. 内容: " + logMessage.Content + "\r\n");
            strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");
            return strInfo.ToString();
        }
        /// <summary>
        /// 生成警告
        /// </summary>
        /// <param name="logMessage">对象</param>
        /// <returns></returns>
        public string WarnFormat(LogMessageEntity logMessage)
        {
            StringBuilder strInfo = new StringBuilder();
            strInfo.Append("1. 警告: >> 操作时间: " + logMessage.OperationTime + "   操作人: " + logMessage.UserName + " \r\n");
            strInfo.Append("2. 地址: " + logMessage.Url + "    \r\n");
            strInfo.Append("3. 类名: " + logMessage.Class + " \r\n");
            strInfo.Append("4. Ip  : " + logMessage.Ip + "   主机: " + logMessage.Host + "   浏览器: " + logMessage.Browser + "    \r\n");
            strInfo.Append("5. 内容: " + logMessage.Content + "\r\n");
            strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");
            return strInfo.ToString();
        }
        /// <summary>
        /// 生成信息
        /// </summary>
        /// <param name="logMessage">对象</param>
        /// <returns></returns>
        public string InfoFormat(LogMessageEntity logMessage)
        {
            StringBuilder strInfo = new StringBuilder();
            strInfo.Append("1. 信息: >> 操作时间: " + logMessage.OperationTime + "   操作人: " + logMessage.UserName + " \r\n");
            strInfo.Append("2. 地址: " + logMessage.Url + "    \r\n");
            strInfo.Append("3. 类名: " + logMessage.Class + " \r\n");
            strInfo.Append("4. Ip  : " + logMessage.Ip + "   主机: " + logMessage.Host + "   浏览器: " + logMessage.Browser + "    \r\n");
            strInfo.Append("5. 内容: " + logMessage.Content + "\r\n");
            strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");
            return strInfo.ToString();
        }
        /// <summary>
        /// 生成调试
        /// </summary>
        /// <param name="logMessage">对象</param>
        /// <returns></returns>
        public string DebugFormat(LogMessageEntity logMessage)
        {
            StringBuilder strInfo = new StringBuilder();
            strInfo.Append("1. 调试: >> 操作时间: " + logMessage.OperationTime + "   操作人: " + logMessage.UserName + " \r\n");
            strInfo.Append("2. 地址: " + logMessage.Url + "    \r\n");
            strInfo.Append("3. 类名: " + logMessage.Class + " \r\n");
            strInfo.Append("4. Ip  : " + logMessage.Ip + "   主机: " + logMessage.Host + "   浏览器: " + logMessage.Browser + "    \r\n");
            strInfo.Append("5. 内容: " + logMessage.Content + "\r\n");
            strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");
            return strInfo.ToString();
        }
        /// <summary>
        /// 生成异常信息
        /// </summary>
        /// <param name="logMessage">对象</param>
        /// <returns></returns>
        public string ExceptionFormat(LogMessageEntity logMessage)
        {
            StringBuilder strInfo = new StringBuilder();
            strInfo.Append("1. 调试: >> 操作时间: " + logMessage.OperationTime + "   操作人: " + logMessage.UserName + " \r\n");
            strInfo.Append("2. 地址: " + logMessage.Url + "    \r\n");
            strInfo.Append("3. 类名: " + logMessage.Class + " \r\n");
            strInfo.Append("4. 主机: " + logMessage.Host + "   Ip  : " + logMessage.Ip + "   浏览器: " + logMessage.Browser + "    \r\n");
            strInfo.Append("5. 异常: " + logMessage.ExceptionInfo + "\r\n");
            //strInfo.Append("6. 来源: " + logMessage.ExceptionSource + "\r\n");
            //strInfo.Append("7. 实例: " + logMessage.ExceptionRemark + "\r\n");
            strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");
            return strInfo.ToString();
        }
    }
}

创建日志类,代码如下:

using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MVCCuetomerExcepFilterDemo.Util
{
    /// <summary>
    /// 日志
    /// </summary>
    public class Log
    {
        private ILog logger;
        public Log(ILog log)
        {
            this.logger = log;
        }
        public void Debug(object message)
        {
            this.logger.Debug(message);
        }
        public void Error(object message)
        {
            this.logger.Error(message);
        }
        public void Info(object message)
        {
            this.logger.Info(message);
        }


        public void Warn(object message)
        {
            this.logger.Warn(message);
        }
    }
}

创建日志初始化类,代码如下:

using log4net;
using MVCCuetomerExcepFilterDemo.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;

namespace MVCCuetomerExcepFilterDemo.Util
{
    /// <summary>
    /// 日志初始化
    /// </summary>
    public class LogFactory
    {
        static LogFactory()
        {
            FileInfo configFile = new FileInfo(HttpContext.Current.Server.MapPath("/XmlConfig/log4net.config"));
            log4net.Config.XmlConfigurator.Configure(configFile);
        }
        public static Log GetLogger(Type type)
        {
            return new Log(LogManager.GetLogger(type));
        }
        public static Log GetLogger(string str)
        {
            return new Log(LogManager.GetLogger(str));
        }
    }
}

最后添加log4net的配置文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

  <log4net>
    <!--根配置-->
    <root>
      <!--日志级别:可选值: ERROR > WARN > INFO > DEBUG -->
      <level value="ERROR"/>
      <level value="WARN"/>
      <level value="INFO"/>
      <level value="DEBUG"/>
      <appender-ref ref="ErrorLog" />
      <appender-ref ref="WarnLog" />
      <appender-ref ref="InfoLog" />
      <appender-ref ref="DebugLog" />
    </root>
    <!-- 错误 Error.log-->
    <appender name="ErrorLog" type="log4net.Appender.RollingFileAppender">
      <!--目录路径,可以是相对路径或绝对路径-->
      <param name="File" value="D:\log"/>
      <!--文件名,按日期生成文件夹-->
      <param name="DatePattern" value="/yyyy-MM-dd/&quot;Error.log&quot;"/>
      <!--追加到文件-->
      <appendToFile value="true"/>
      <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
      <rollingStyle value="Composite"/>
      <!--写到一个文件-->
      <staticLogFileName value="false"/>
      <!--单个文件大小。单位:KB|MB|GB-->
      <maximumFileSize value="200MB"/>
      <!--最多保留的文件数,设为"-1"则不限-->
      <maxSizeRollBackups value="-1"/>
      <!--日志格式-->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message"/>
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="ERROR" />
        <param name="LevelMax" value="ERROR" />
      </filter>
    </appender>

    <!-- 警告 Warn.log-->
    <appender name="WarnLog" type="log4net.Appender.RollingFileAppender">
      <!--目录路径,可以是相对路径或绝对路径-->
      <param name="File" value="D:\log"/>
      <!--文件名,按日期生成文件夹-->
      <param name="DatePattern" value="/yyyy-MM-dd/&quot;Warn.log&quot;"/>
      <!--追加到文件-->
      <appendToFile value="true"/>
      <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
      <rollingStyle value="Composite"/>
      <!--写到一个文件-->
      <staticLogFileName value="false"/>
      <!--单个文件大小。单位:KB|MB|GB-->
      <maximumFileSize value="200MB"/>
      <!--最多保留的文件数,设为"-1"则不限-->
      <maxSizeRollBackups value="-1"/>
      <!--日志格式-->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message"/>
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="WARN" />
        <param name="LevelMax" value="WARN" />
      </filter>
    </appender>

    <!-- 信息 Info.log-->
    <appender name="InfoLog" type="log4net.Appender.RollingFileAppender">
      <!--目录路径,可以是相对路径或绝对路径-->
      <param name="File" value="D:\log"/>
      <!--文件名,按日期生成文件夹-->
      <param name="DatePattern" value="/yyyy-MM-dd/&quot;Info.log&quot;"/>
      <!--追加到文件-->
      <appendToFile value="true"/>
      <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
      <rollingStyle value="Composite"/>
      <!--写到一个文件-->
      <staticLogFileName value="false"/>
      <!--单个文件大小。单位:KB|MB|GB-->
      <maximumFileSize value="200MB"/>
      <!--最多保留的文件数,设为"-1"则不限-->
      <maxSizeRollBackups value="-1"/>
      <!--日志格式-->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message"/>
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="INFO" />
        <param name="LevelMax" value="INFO" />
      </filter>
    </appender>

    <!-- 调试 Debug.log-->
    <appender name="DebugLog" type="log4net.Appender.RollingFileAppender">
      <!--目录路径,可以是相对路径或绝对路径-->
      <param name="File" value="D:\log"/>
      <!--文件名,按日期生成文件夹-->
      <param name="DatePattern" value="/yyyy-MM-dd/&quot;Debug.log&quot;"/>
      <!--追加到文件-->
      <appendToFile value="true"/>
      <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
      <rollingStyle value="Composite"/>
      <!--写到一个文件-->
      <staticLogFileName value="false"/>
      <!--单个文件大小。单位:KB|MB|GB-->
      <maximumFileSize value="200MB"/>
      <!--最多保留的文件数,设为"-1"则不限-->
      <maxSizeRollBackups value="-1"/>
      <!--日志格式-->
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%message"/>
      </layout>
      <filter type="log4net.Filter.LevelRangeFilter">
        <param name="LevelMin" value="DEBUG" />
        <param name="LevelMax" value="DEBUG" />
      </filter>
    </appender>


  </log4net>
  <startup>
    <supportedRuntime version="v4.0" sku=".netFramework,Version=v4.5" />
  </startup>
</configuration>

1.2、创建网络工具类

该工具帮助类用于获取IP、浏览器信息等内容,代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Web;

namespace MVCCuetomerExcepFilterDemo.Util
{
    /// <summary>
    /// 网络操作帮助类
    /// </summary>
    public class NetHelper
    {
        #region Ip(获取Ip)

        /// <summary>
        /// 获取Ip
        /// </summary>
        public static string Ip
        {
            get
            {
                var result = string.Empty;
                if (HttpContext.Current != null)
                    result = GetWebClientIp();
                if (string.IsNullOrWhiteSpace(result))
                    result = GetLanIp();
                return result;
            }
        }

        /// <summary>
        /// 获取Web客户端的Ip
        /// </summary>
        private static string GetWebClientIp()
        {
            var ip = GetWebRemoteIp();
            foreach (var hostAddress in Dns.GetHostAddresses(ip))
            {
                if (hostAddress.AddressFamily == AddressFamily.InterNetwork)
                    return hostAddress.ToString();
            }
            return string.Empty;
        }

        /// <summary>
        /// 获取Web远程Ip
        /// </summary>
        private static string GetWebRemoteIp()
        {
            return HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
        }

        /// <summary>
        /// 获取局域网IP
        /// </summary>
        private static string GetLanIp()
        {
            foreach (var hostAddress in Dns.GetHostAddresses(Dns.GetHostName()))
            {
                if (hostAddress.AddressFamily == AddressFamily.InterNetwork)
                    return hostAddress.ToString();
            }
            return string.Empty;
        }

        #endregion

        #region Host(获取主机名)

        /// <summary>
        /// 获取主机名
        /// </summary>
        public static string Host
        {
            get
            {
                return HttpContext.Current == null ? Dns.GetHostName() : GetWebClientHostName();
            }
        }

        /// <summary>
        /// 获取Web客户端主机名
        /// </summary>
        private static string GetWebClientHostName()
        {
            if (!HttpContext.Current.Request.IsLocal)
                return string.Empty;
            var ip = GetWebRemoteIp();
            var result = Dns.GetHostEntry(IPAddress.Parse(ip)).HostName;
            if (result == "localhost.localdomain")
                result = Dns.GetHostName();
            return result;
        }

        #endregion

        #region Browser(获取浏览器信息)

        /// <summary>
        /// 获取浏览器信息
        /// </summary>
        public static string Browser
        {
            get
            {
                if (HttpContext.Current == null)
                    return string.Empty;
                var browser = HttpContext.Current.Request.Browser;
                return string.Format("{0} {1}", browser.Browser, browser.Version);
            }
        }

        #endregion
    }
}

2、创建自定义异常类

上篇文章中讲过了,要创建自定义异常类,只需要创建一个继承自HandleErrorAttribute的类,并重写OnException方法即可,自定义异常类代码如下:

using MVCCuetomerExcepFilterDemo.Models;
using MVCCuetomerExcepFilterDemo.Util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MVCCuetomerExcepFilterDemo.Extension
{
    /// <summary>
    /// 错误日志(Controller发生异常时会执行这里) 
    /// </summary>
    public class ExceptionFilters : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            WriteLog(filterContext);
            base.OnException(filterContext);
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.StatusCode = 200;
        }

        /// <summary>
        /// 写入日志(log4net)
        /// </summary>
        /// <param name="context">提供使用</param>
        private void WriteLog(ExceptionContext context)
        {

            if (context == null)
                return;
            var log = LogFactory.GetLogger(context.Controller.ToString());
            Exception Error = context.Exception;
            LogMessageEntity logMessage = new LogMessageEntity();
            logMessage.OperationTime = DateTime.Now;
            logMessage.Url = HttpContext.Current.Request.RawUrl;
            logMessage.Class = context.Controller.ToString();
            logMessage.Ip = NetHelper.Ip;
            logMessage.Host = NetHelper.Host;
            logMessage.Browser = NetHelper.Browser;
            // 这里为了方便直接用默认的,真实案例中不能这样写
            logMessage.UserName = "admin";
            if (Error.InnerException == null)
            {
                logMessage.ExceptionInfo = Error.Message;
            }
            else
            {
                logMessage.ExceptionInfo = Error.InnerException.Message;
            }
            string strMessage = new LogFormat().ExceptionFormat(logMessage);
            log.Error(strMessage);
        }
    }
}

3、创建控制器

控制器里面有一个LoGon登录的方法,代码如下:

using MVCCuetomerExcepFilterDemo.Extension;
using MVCCuetomerExcepFilterDemo.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;

namespace MVCCuetomerExcepFilterDemo.Controllers
{
    public class AccountController : Controller
    {
        // GET: Account
        public ActionResult Index()
        {
            return View();
        }

        /// <summary>
        /// 登录成功显示的视图
        /// </summary>
        /// <returns></returns>
        public ActionResult Welcome()
        {
            return View();
        }

        /// <summary>
        /// 显示登录视图
        /// </summary>
        /// <returns></returns>
        public ActionResult LogOn()
        {
            LogOnViewModel model = new LogOnViewModel();
            return View(model);

        }

        /// <summary>
        /// 处理用户点击登录提交回发的表单
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        [ExceptionFilters]
        public ActionResult LogOn(LogOnViewModel model)
        {
            try
            {
                string userName = model.UserName.Trim();
                int passWord = Convert.ToInt32(model.Password);
                // 用户名是admin,密码是123456表示验证通过
                if (userName.Equals("admin")&&password.Equals(123456))
                {
                    // 判断是否勾选了记住我
                    if (model.RememberMe)
                    {
                        //2880分钟有效期的cookie
                        FormsAuthentication.SetAuthCookie(model.UserName, true);
                    }
                    else
                    {
                        //会话cookie
                        FormsAuthentication.SetAuthCookie(model.UserName, false);
                    }
                    // 跳转到Account控制器的Welcome方法
                    return RedirectToAction("Welcome");
                }
                else
                {
                    return View(model);

                }
            }
            catch (Exception ex)
            {
                // 抛出异常
                throw;
            }

        }
    }
}

4、测试

在控制器代码中,如果输入的用户名是admin,密码是123456就通过,然后显示Welcome视图,如果密码转换失败的时候就记录异常日志。

首先输入正确的用户名和密码:

点击登录,然后显示Welcome视图:

这次输入错误的密码:

再次点击登录,这时查看生成的日志:

在上面的代码中,我们在LogOn()方法上面使用了ExceptionFilters这个特性,这样在控制器发生异常的时候就会进入ExceptionFilters自定义异常类,然后记录日志。但是这样有一个问题:使用这种方式要再每个action方法上面都添加该特性,如果action方法比较多,写起来也是很烦的,那么有没有什么好的办法呢?可以在控制器上面添加ExceptionFilters特性,这样就是针对整个控制器里面的action了。那么还有没有更简洁的办法。看App_Start文件夹下面的FilterConfig定义:

using MVCCuetomerExcepFilterDemo.Extension;
using System.Web;
using System.Web.Mvc;

namespace MVCCuetomerExcepFilterDemo
{
    public class FilterConfig
    {
        public static void ReGISterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }
    }
}

可以看到这里是添加的HandleErrorAttribute类,如果换成自定义的异常类会如何呢?修改后的FilterConfig文件如下:

using MVCCuetomerExcepFilterDemo.Extension;
using System.Web;
using System.Web.Mvc;

namespace MVCCuetomerExcepFilterDemo
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //filters.Add(new HandleErrorAttribute());
            // 使用自定义异常类
            filters.Add(new ExceptionFilters());
        }
    }
}

AccountController控制器代码修改如下:

using MVCCuetomerExcepFilterDemo.Extension;
using MVCCuetomerExcepFilterDemo.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;

namespace MVCCuetomerExcepFilterDemo.Controllers
{
    public class AccountController : Controller
    {
        // GET: Account
        public ActionResult Index()
        {
            return View();
        }

        /// <summary>
        /// 登录成功显示的视图
        /// </summary>
        /// <returns></returns>
        public ActionResult Welcome()
        {
            return View();
        }

        /// <summary>
        /// 显示登录视图
        /// </summary>
        /// <returns></returns>
        public ActionResult LogOn()
        {
            LogOnViewModel model = new LogOnViewModel();
            return View(model);

        }

        /// <summary>
        /// 处理用户点击登录提交回发的表单
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        // [ExceptionFilters]
        public ActionResult LogOn(LogOnViewModel model)
        {
            try
            {
                string userName = model.UserName.Trim();
                int password = Convert.ToInt32(model.Password);
                // 用户名是admin,密码是123456表示验证通过
                if (userName.Equals("admin")&&password.Equals(123456))
                {
                    // 判断是否勾选了记住我
                    if (model.RememberMe)
                    {
                        //2880分钟有效期的cookie
                        FormsAuthentication.SetAuthCookie(model.UserName, true);
                    }
                    else
                    {
                        //会话cookie
                        FormsAuthentication.SetAuthCookie(model.UserName, false);
                    }
                    // 跳转到Account控制器的Welcome方法
                    return RedirectToAction("Welcome");
                }
                else
                {
                    return View(model);

                }
            }
            catch (Exception ex)
            {
                // 抛出异常
                throw;
            }

        }
    }
}

这样发生异常的时候就会自动进入自定义异常类了,然后记录日志。

到此这篇关于asp.net MVC自定义异常过滤器使用案例的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: ASP.NET MVC自定义异常过滤器使用案例

本文链接: https://lsjlt.com/news/142667.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ASP.NET MVC自定义异常过滤器使用案例
    目录一、需求二、案例1、创建工具类1.1、创建日志工具类1.2、创建网络工具类2、创建自定义异常类3、创建控制器4、测试在上一篇文章中讲解了自定义异常过滤器,这篇文章会结合工作中的真...
    99+
    2024-04-02
  • ASP.NET MVC自定义操作过滤器
    目录一、操作过滤器1、定义2、案例2.1、创建自定义操作过滤器2.2、新建控制器二、结果过滤器1、定义2、案例三、案例1、记录操作1.1、创建实体类1.2、创建日志类1.3、修改操作...
    99+
    2024-04-02
  • ASP.NETMVC自定义异常过滤器
    一、异常过滤器 异常筛选器用于实现IExceptionFilter接口,并在ASP.NET MVC管道执行期间引发了未处理的异常时执行。异常筛选器可用于执行诸如日志记录或显示错误页之...
    99+
    2024-04-02
  • ASP.NET MVC授权过滤器如何使用
    这篇文章主要介绍“ASP.NET MVC授权过滤器如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ASP.NET MVC授权过滤器如何使用”文章能帮助大家解决问题。过滤器过...
    99+
    2023-06-29
  • Vue过滤器怎么自定义及使用
    这篇文章主要介绍“Vue过滤器怎么自定义及使用”,在日常操作中,相信很多人在Vue过滤器怎么自定义及使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue过滤器怎么自定义及使用”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-04
  • C#中如何使用异常过滤器处理特定异常
    C#中如何使用异常过滤器处理特定异常异常处理是开发过程中不可或缺的一部分。当程序出现异常时,能够准确定位并处理异常,是保证程序稳定性和可靠性的重要环节之一。C#提供了异常过滤器(Exception Filter)的机制,可以根据需求选择性地...
    99+
    2023-10-22
    C# 特定异常处理 异常过滤器
  • vue 过滤器和自定义指令的使用
    目录过滤器 01. 是什么 02. 怎么做 (1)定义过滤器 (2)使用方式 (3)过滤器的参数03. 封装过滤器函数 自定义指令 01. 是什么 02. 基本概念 (1)钩子函数 ...
    99+
    2024-04-02
  • MySQL 自定义变量@ 常用案例
    以下文章来源于SQL开发与优化,作者郑松华 大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子 很久没有写文章,最近碰到了一个非常有意思的Oracle SQL 案例, 这个案例,我用了一些窗口函数来解决的,后来想想,能否跟MySQL...
    99+
    2019-03-05
    MySQL 自定义变量@ 常用案例
  • Vue中过滤器定义以及使用方法实例
    目录介绍Vue中过滤器如何使用组件内过滤器全局过滤器补充:vue中的过滤器可以格式化以及美化内容总结介绍 过滤器实质不改变原始数据,只是对数据进行加工处理后返回过滤后的数据再进行调用...
    99+
    2022-11-13
    vue过滤器的使用 vue的过滤器 vue的过滤器语法
  • C#中如何使用异常过滤器和异常处理
    C#中如何使用异常过滤器和异常处理,需要具体代码示例异常是在程序运行过程中出现的错误或意外情况。在C#中,异常是通过抛出和捕获来处理的。异常处理是保证程序正常运行的关键部分。在C#中,异常过滤器和异常处理是处理异常的两种常见方式。异常过滤器...
    99+
    2023-10-22
    异常处理 异常过滤器 C#语言
  • 如何在vue中使用过滤器和自定义指令
    本篇文章给大家分享的是有关如何在vue中使用过滤器和自定义指令,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。过滤器过滤器可以对我们传入的数据进行必要的处理,并返回处理的结果过滤...
    99+
    2023-06-15
  • 使用SpringBoot如何实现自定义过滤器与拦截器
    使用SpringBoot如何实现定义过滤器与拦截器?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、自定义过滤器创建一个过滤器,实现javax.servlet.Filter...
    99+
    2023-05-31
    springboot 拦截器 监听器
  • Java自定义异常与异常使用的最佳方式
    目录异常的分类1. 非运行时异常(Checked Exception)2. 运行时异常(Runtime Exception/Unchecked Exception)异常的处理一、对应非运行时异常,必须对其进行处理二、对于运行时异常,可以不对...
    99+
    2019-09-12
    Java异常 自定义异常 异常使用
  • python用户自定义异常的实例讲解
    说明 程序可以通过创建一个新的异常类来命名它们自己的异常。异常应该是典型的继承自Exception类,直接或间接的方式。 异常python有一个大基类,继承了Exception。因此,我们的定制类也必须继承Excep...
    99+
    2022-06-02
    python 自定义 异常
  • python用户自定义异常的示例分析
    这篇文章主要介绍了python用户自定义异常的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。说明程序可以通过创建一个新的异常类来命名它们自己的异常。异常应该是典型的继...
    99+
    2023-06-20
  • Spring MVC 自定义数据转换器的思路案例详解
    数据转换器是指将客户端 http 请求中的参数转换为业务方法中定义的形参,自定义表示开发者可以自主设计转换模式,HandlerAdapter 已经提供了通用的转换,比如将 Strin...
    99+
    2024-04-02
  • python中如何使用自定义异常类
    本篇文章为大家展示了python中如何使用自定义异常类,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。自定义异常类自定义类继承系统的异常基类exception自定义异常类的构造函数等方法进行处理举例:...
    99+
    2023-06-20
  • 使用Java如何实现异常自定义
    今天就跟大家聊聊有关使用Java如何实现异常自定义,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。具体代码如下所示: class ChushulingException ext...
    99+
    2023-05-31
    java 自定义异常 ava
  • vue定义私有过滤器和基本使用
    私有过滤器和全局过滤器的方法和概念都相同,只是一个是全局都可以调用,而私有的只有自己可以调用, 全局过滤器点这里全局过滤器 使用方法也和全局过滤器一致,只是定义的地方不同 全局过...
    99+
    2024-04-02
  • Django零基础入门之自定义过滤器及模板中的使用
    目录引言自定义过滤器(1)首先(2)内置过滤器lower的使用:(3)自定义过滤器的使用:(4)模板中使用自定义过滤器:(5)效果展示:引言 分析Django内置的模板过滤器: 通...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作