ASP.NET?MVC自定義異常過(guò)濾器使用案例
在上一篇文章中講解了自定義異常過(guò)濾器,這篇文章會(huì)結(jié)合工作中的真實(shí)案例講解一下如何使用自定義異常過(guò)濾器。
一、需求
本案例要實(shí)現(xiàn)的功能需求:在發(fā)生異常時(shí)記錄日志,日志內(nèi)容包括發(fā)生異常的Controller名稱(chēng)、Action名稱(chēng)、使用瀏覽器類(lèi)型和版本等。
二、案例
1、創(chuàng)建工具類(lèi)
首先創(chuàng)建項(xiàng)目中需要使用的工具類(lèi)。
1.1、創(chuàng)建日志工具類(lèi)
在案例中使用Log4net來(lái)記錄日志。首先要添加對(duì)Log4net的引用,直接在NuGet里面搜索Log4net,然后安裝即可。
日志消息實(shí)體類(lèi)代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MVCCuetomerExcepFilterDemo.Models
{
/// <summary>
/// 日志消息實(shí)體類(lèi)
/// </summary>
public class LogMessageEntity
{
/// <summary>
/// 操作時(shí)間
/// </summary>
public DateTime OperationTime { get; set; }
/// <summary>
/// Url地址
/// </summary>
public string Url { get; set; }
/// <summary>
/// 類(lèi)名
/// </summary>
public string Class { get; set; }
/// <summary>
/// IP
/// </summary>
public string Ip { get; set; }
/// <summary>
/// 主機(jī)
/// </summary>
public string Host { get; set; }
/// <summary>
/// 瀏覽器
/// </summary>
public string Browser { get; set; }
/// <summary>
/// 操作人
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 內(nèi)容
/// </summary>
public string Content { get; set; }
/// <summary>
/// 異常信息
/// </summary>
public string ExceptionInfo { get; set; }
/// <summary>
/// 異常來(lái)源
/// </summary>
public string ExceptionSource { get; set; }
/// <summary>
/// 異常信息備注
/// </summary>
public string ExceptionRemark { get; set; }
}
}創(chuàng)建日志級(jí)別枚舉類(lèi)型,分別對(duì)應(yīng)Log4net中的日志級(jí)別,代碼如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Web;
namespace MVCCuetomerExcepFilterDemo.Models.Enums
{
/// <summary>
/// 日志級(jí)別
/// </summary>
public enum LogLevel
{
/// <summary>
/// 錯(cuò)誤
/// </summary>
[Description("錯(cuò)誤")]
Error,
/// <summary>
/// 警告
/// </summary>
[Description("警告")]
Warning,
/// <summary>
/// 信息
/// </summary>
[Description("信息")]
Info,
/// <summary>
/// 調(diào)試
/// </summary>
[Description("調(diào)試")]
Debug
}
}創(chuàng)建一個(gè)對(duì)日志格式進(jìn)行格式化的類(lèi),代碼如下:
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>
/// 生成錯(cuò)誤
/// </summary>
/// <param name="logMessage">對(duì)象</param>
/// <returns></returns>
public string ErrorFormat(LogMessageEntity logMessage)
{
StringBuilder strInfo = new StringBuilder();
strInfo.Append("1. 錯(cuò)誤: >> 操作時(shí)間: " + logMessage.OperationTime + " 操作人: " + logMessage.UserName + " \r\n");
strInfo.Append("2. 地址: " + logMessage.Url + " \r\n");
strInfo.Append("3. 類(lèi)名: " + logMessage.Class + " \r\n");
strInfo.Append("4. Ip : " + logMessage.Ip + " 主機(jī): " + logMessage.Host + " 瀏覽器: " + logMessage.Browser + " \r\n");
strInfo.Append("5. 內(nèi)容: " + logMessage.Content + "\r\n");
strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");
return strInfo.ToString();
}
/// <summary>
/// 生成警告
/// </summary>
/// <param name="logMessage">對(duì)象</param>
/// <returns></returns>
public string WarnFormat(LogMessageEntity logMessage)
{
StringBuilder strInfo = new StringBuilder();
strInfo.Append("1. 警告: >> 操作時(shí)間: " + logMessage.OperationTime + " 操作人: " + logMessage.UserName + " \r\n");
strInfo.Append("2. 地址: " + logMessage.Url + " \r\n");
strInfo.Append("3. 類(lèi)名: " + logMessage.Class + " \r\n");
strInfo.Append("4. Ip : " + logMessage.Ip + " 主機(jī): " + logMessage.Host + " 瀏覽器: " + logMessage.Browser + " \r\n");
strInfo.Append("5. 內(nèi)容: " + logMessage.Content + "\r\n");
strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");
return strInfo.ToString();
}
/// <summary>
/// 生成信息
/// </summary>
/// <param name="logMessage">對(duì)象</param>
/// <returns></returns>
public string InfoFormat(LogMessageEntity logMessage)
{
StringBuilder strInfo = new StringBuilder();
strInfo.Append("1. 信息: >> 操作時(shí)間: " + logMessage.OperationTime + " 操作人: " + logMessage.UserName + " \r\n");
strInfo.Append("2. 地址: " + logMessage.Url + " \r\n");
strInfo.Append("3. 類(lèi)名: " + logMessage.Class + " \r\n");
strInfo.Append("4. Ip : " + logMessage.Ip + " 主機(jī): " + logMessage.Host + " 瀏覽器: " + logMessage.Browser + " \r\n");
strInfo.Append("5. 內(nèi)容: " + logMessage.Content + "\r\n");
strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");
return strInfo.ToString();
}
/// <summary>
/// 生成調(diào)試
/// </summary>
/// <param name="logMessage">對(duì)象</param>
/// <returns></returns>
public string DebugFormat(LogMessageEntity logMessage)
{
StringBuilder strInfo = new StringBuilder();
strInfo.Append("1. 調(diào)試: >> 操作時(shí)間: " + logMessage.OperationTime + " 操作人: " + logMessage.UserName + " \r\n");
strInfo.Append("2. 地址: " + logMessage.Url + " \r\n");
strInfo.Append("3. 類(lèi)名: " + logMessage.Class + " \r\n");
strInfo.Append("4. Ip : " + logMessage.Ip + " 主機(jī): " + logMessage.Host + " 瀏覽器: " + logMessage.Browser + " \r\n");
strInfo.Append("5. 內(nèi)容: " + logMessage.Content + "\r\n");
strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");
return strInfo.ToString();
}
/// <summary>
/// 生成異常信息
/// </summary>
/// <param name="logMessage">對(duì)象</param>
/// <returns></returns>
public string ExceptionFormat(LogMessageEntity logMessage)
{
StringBuilder strInfo = new StringBuilder();
strInfo.Append("1. 調(diào)試: >> 操作時(shí)間: " + logMessage.OperationTime + " 操作人: " + logMessage.UserName + " \r\n");
strInfo.Append("2. 地址: " + logMessage.Url + " \r\n");
strInfo.Append("3. 類(lèi)名: " + logMessage.Class + " \r\n");
strInfo.Append("4. 主機(jī): " + logMessage.Host + " Ip : " + logMessage.Ip + " 瀏覽器: " + logMessage.Browser + " \r\n");
strInfo.Append("5. 異常: " + logMessage.ExceptionInfo + "\r\n");
//strInfo.Append("6. 來(lái)源: " + logMessage.ExceptionSource + "\r\n");
//strInfo.Append("7. 實(shí)例: " + logMessage.ExceptionRemark + "\r\n");
strInfo.Append("-----------------------------------------------------------------------------------------------------------------------------\r\n");
return strInfo.ToString();
}
}
}創(chuàng)建日志類(lèi),代碼如下:
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);
}
}
}創(chuàng)建日志初始化類(lèi),代碼如下:
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>
<!--日志級(jí)別:可選值: 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>
<!-- 錯(cuò)誤 Error.log-->
<appender name="ErrorLog" type="log4net.Appender.RollingFileAppender">
<!--目錄路徑,可以是相對(duì)路徑或絕對(duì)路徑-->
<param name="File" value="D:\log"/>
<!--文件名,按日期生成文件夾-->
<param name="DatePattern" value="/yyyy-MM-dd/"Error.log""/>
<!--追加到文件-->
<appendToFile value="true"/>
<!--創(chuàng)建日志文件的方式,可選值:Date[日期],文件大小[Size],混合[Composite]-->
<rollingStyle value="Composite"/>
<!--寫(xiě)到一個(gè)文件-->
<staticLogFileName value="false"/>
<!--單個(gè)文件大小。單位:KB|MB|GB-->
<maximumFileSize value="200MB"/>
<!--最多保留的文件數(shù),設(shè)為"-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">
<!--目錄路徑,可以是相對(duì)路徑或絕對(duì)路徑-->
<param name="File" value="D:\log"/>
<!--文件名,按日期生成文件夾-->
<param name="DatePattern" value="/yyyy-MM-dd/"Warn.log""/>
<!--追加到文件-->
<appendToFile value="true"/>
<!--創(chuàng)建日志文件的方式,可選值:Date[日期],文件大小[Size],混合[Composite]-->
<rollingStyle value="Composite"/>
<!--寫(xiě)到一個(gè)文件-->
<staticLogFileName value="false"/>
<!--單個(gè)文件大小。單位:KB|MB|GB-->
<maximumFileSize value="200MB"/>
<!--最多保留的文件數(shù),設(shè)為"-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">
<!--目錄路徑,可以是相對(duì)路徑或絕對(duì)路徑-->
<param name="File" value="D:\log"/>
<!--文件名,按日期生成文件夾-->
<param name="DatePattern" value="/yyyy-MM-dd/"Info.log""/>
<!--追加到文件-->
<appendToFile value="true"/>
<!--創(chuàng)建日志文件的方式,可選值:Date[日期],文件大小[Size],混合[Composite]-->
<rollingStyle value="Composite"/>
<!--寫(xiě)到一個(gè)文件-->
<staticLogFileName value="false"/>
<!--單個(gè)文件大小。單位:KB|MB|GB-->
<maximumFileSize value="200MB"/>
<!--最多保留的文件數(shù),設(shè)為"-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>
<!-- 調(diào)試 Debug.log-->
<appender name="DebugLog" type="log4net.Appender.RollingFileAppender">
<!--目錄路徑,可以是相對(duì)路徑或絕對(duì)路徑-->
<param name="File" value="D:\log"/>
<!--文件名,按日期生成文件夾-->
<param name="DatePattern" value="/yyyy-MM-dd/"Debug.log""/>
<!--追加到文件-->
<appendToFile value="true"/>
<!--創(chuàng)建日志文件的方式,可選值:Date[日期],文件大小[Size],混合[Composite]-->
<rollingStyle value="Composite"/>
<!--寫(xiě)到一個(gè)文件-->
<staticLogFileName value="false"/>
<!--單個(gè)文件大小。單位:KB|MB|GB-->
<maximumFileSize value="200MB"/>
<!--最多保留的文件數(shù),設(shè)為"-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、創(chuàng)建網(wǎng)絡(luò)工具類(lèi)
該工具幫助類(lèi)用于獲取IP、瀏覽器信息等內(nèi)容,代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Web;
namespace MVCCuetomerExcepFilterDemo.Util
{
/// <summary>
/// 網(wǎng)絡(luò)操作幫助類(lèi)
/// </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客戶(hù)端的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遠(yuǎn)程Ip
/// </summary>
private static string GetWebRemoteIp()
{
return HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
/// <summary>
/// 獲取局域網(wǎng)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(獲取主機(jī)名)
/// <summary>
/// 獲取主機(jī)名
/// </summary>
public static string Host
{
get
{
return HttpContext.Current == null ? Dns.GetHostName() : GetWebClientHostName();
}
}
/// <summary>
/// 獲取Web客戶(hù)端主機(jī)名
/// </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、創(chuàng)建自定義異常類(lèi)
上篇文章中講過(guò)了,要?jiǎng)?chuàng)建自定義異常類(lèi),只需要?jiǎng)?chuàng)建一個(gè)繼承自HandleErrorAttribute的類(lèi),并重寫(xiě)OnException方法即可,自定義異常類(lèi)代碼如下:
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>
/// 錯(cuò)誤日志(Controller發(fā)生異常時(shí)會(huì)執(zhí)行這里)
/// </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>
/// 寫(xiě)入日志(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;
// 這里為了方便直接用默認(rèn)的,真實(shí)案例中不能這樣寫(xiě)
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、創(chuàng)建控制器
控制器里面有一個(gè)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>
/// 處理用戶(hù)點(diǎn)擊登錄提交回發(fā)的表單
/// </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);
// 用戶(hù)名是admin,密碼是123456表示驗(yàn)證通過(guò)
if (userName.Equals("admin")&&password.Equals(123456))
{
// 判斷是否勾選了記住我
if (model.RememberMe)
{
//2880分鐘有效期的cookie
FormsAuthentication.SetAuthCookie(model.UserName, true);
}
else
{
//會(huì)話cookie
FormsAuthentication.SetAuthCookie(model.UserName, false);
}
// 跳轉(zhuǎn)到Account控制器的Welcome方法
return RedirectToAction("Welcome");
}
else
{
return View(model);
}
}
catch (Exception ex)
{
// 拋出異常
throw;
}
}
}
}4、測(cè)試
在控制器代碼中,如果輸入的用戶(hù)名是admin,密碼是123456就通過(guò),然后顯示W(wǎng)elcome視圖,如果密碼轉(zhuǎn)換失敗的時(shí)候就記錄異常日志。
首先輸入正確的用戶(hù)名和密碼:

點(diǎn)擊登錄,然后顯示W(wǎng)elcome視圖:

這次輸入錯(cuò)誤的密碼:

再次點(diǎn)擊登錄,這時(shí)查看生成的日志:

在上面的代碼中,我們?cè)贚ogOn()方法上面使用了ExceptionFilters這個(gè)特性,這樣在控制器發(fā)生異常的時(shí)候就會(huì)進(jìn)入ExceptionFilters自定義異常類(lèi),然后記錄日志。但是這樣有一個(gè)問(wèn)題:使用這種方式要再每個(gè)action方法上面都添加該特性,如果action方法比較多,寫(xiě)起來(lái)也是很煩的,那么有沒(méi)有什么好的辦法呢?可以在控制器上面添加ExceptionFilters特性,這樣就是針對(duì)整個(gè)控制器里面的action了。那么還有沒(méi)有更簡(jiǎn)潔的辦法??碅pp_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類(lèi),如果換成自定義的異常類(lèi)會(huì)如何呢?修改后的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());
// 使用自定義異常類(lèi)
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>
/// 處理用戶(hù)點(diǎn)擊登錄提交回發(fā)的表單
/// </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);
// 用戶(hù)名是admin,密碼是123456表示驗(yàn)證通過(guò)
if (userName.Equals("admin")&&password.Equals(123456))
{
// 判斷是否勾選了記住我
if (model.RememberMe)
{
//2880分鐘有效期的cookie
FormsAuthentication.SetAuthCookie(model.UserName, true);
}
else
{
//會(huì)話cookie
FormsAuthentication.SetAuthCookie(model.UserName, false);
}
// 跳轉(zhuǎn)到Account控制器的Welcome方法
return RedirectToAction("Welcome");
}
else
{
return View(model);
}
}
catch (Exception ex)
{
// 拋出異常
throw;
}
}
}
}這樣發(fā)生異常的時(shí)候就會(huì)自動(dòng)進(jìn)入自定義異常類(lèi)了,然后記錄日志。
到此這篇關(guān)于ASP.NET MVC自定義異常過(guò)濾器使用案例的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- ASP.NET?MVC自定義操作過(guò)濾器
- ASP.NET MVC自定義授權(quán)過(guò)濾器
- ASP.NET MVC自定義異常過(guò)濾器
- ASP.NET?MVC授權(quán)過(guò)濾器用法
- ASP.NET MVC異常過(guò)濾器用法
- ASP.NET MVC緩存過(guò)濾器用法
- ASP.NET Core MVC中過(guò)濾器工作原理介紹
- .NET6自定義WebAPI過(guò)濾器
- ASP.NET Core MVC 過(guò)濾器(Filter)
- ASP.NET Core MVC 過(guò)濾器的使用方法介紹
- ASP.NET MVC過(guò)濾器執(zhí)行順序介紹
相關(guān)文章
ASP.NET中Validation驗(yàn)證控件正則表達(dá)式特殊符號(hào)的說(shuō)明
本文介紹asp.net中RegularExpressionValidator控件中的幾種特殊字符串使用規(guī)則,并做了代碼演示,希望對(duì)大家有所幫助。2016-04-04
.Net Core3 用Windows 桌面應(yīng)用開(kāi)發(fā)Asp.Net Core網(wǎng)站
這篇文章主要介紹了.Net Core3 用Windows 桌面應(yīng)用開(kāi)發(fā)Asp.Net Core網(wǎng)站,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
深入理解Asp.net中DataBinder.Eval的用法總結(jié)
本篇文章是對(duì)Asp.net中DataBinder.Eval的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
.NET 刷新頁(yè)面防止表單二次提交的實(shí)現(xiàn)方法
頁(yè)面上按鈕是服務(wù)器控件,現(xiàn)在刷新頁(yè)面要防止按鈕事件重復(fù)執(zhí)行。這篇文章給大家?guī)?lái)了.net刷新頁(yè)面防止表單二次提交的實(shí)現(xiàn)方法,非常不錯(cuò),感興趣的朋友一起看看吧2016-09-09
asp.net頁(yè)面與頁(yè)面之間傳參數(shù)值方法(post傳值和get傳值)
這篇文章主要介紹了asp.net頁(yè)面與頁(yè)面之間傳參數(shù)值方法,說(shuō)明了post傳值和get傳值的使用方法,需要的朋友可以參考下2014-02-02
ASP.NET對(duì)無(wú)序列表批量操作的三種方法小結(jié)
在網(wǎng)頁(yè)開(kāi)發(fā)中,經(jīng)常要用到無(wú)序列表。事實(shí)上在符合W3C標(biāo)準(zhǔn)的div+css布局中,無(wú)序列表被大量使用,ASP.NET雖然內(nèi)置了BulletedList控件,用于創(chuàng)建和操作無(wú)序列表,但感覺(jué)不太好用2012-01-01

