Asp MVC(Filter)

Filter分类

1.Authorize//权限验证

2.HandleError//ACTION异常处理

3.OutputCache//限制ASP.NET输出的内容,利用缓存

4.RequireHttps//

 

outputcache用法:

他可以定义在你的某个ACTION上,也可以定义在你的全局web.config中

例如:

 [OutputCache(Duration="60",VaryByParam="none"]

//表示该方法会缓存60秒,结束时候没有任何条件。
        public ActionResult Index()
        {
                        ViewData["Title"] = "This was cached at "+DateTime.Now;
            return View();
        }

 

但是如果你有大量的这种缓存方法要调用,你就可以在web.config中定义一个CACHE.

<system.web>
    <caching>
      <outputCacheSettings>
        <outputCacheProfiles>
          <add name="MyProfile" duration="5" varyByParam="none"/>
        </outputCacheProfiles>
      </outputCacheSettings>

</system.web>

然后通过CacheProfile="你所定义的名字";来引用你定义好的CACHE过滤器

 [OutputCache(CacheProfile = "MyProfile")]
        public ActionResult Index()
        {
                        ViewData["Title"] = "This was cached at "+DateTime.Now;
            return View();
        }

 

Exception Filter

用户捕获某一个ACTION出错时候的异常信息。

 [HandleError(ExceptionType=typeof(ArgumentException),View="ArgError")]
        public ActionResult Index()
        {
            throw new ArgumentException("错误!");
           
            ViewData["Title"] = "This was cached at "+DateTime.Now;
            return View();
        }

他表示如果Index的ACTION跑出了ArgumentException异常,那么就会跳转到ArgError.asp页面进行异常显示

也可以用:

 [HandleError(Order=1,ExceptionType=typeof(ArgumentException),View="ArgError")]

 [HandleError(Order=2,ExceptionType=typeof(Exception))]

//利用ORDER来控制异常捕获的顺序,越小的越先捕获处理。
        public ActionResult Index()
        {
            throw new ArgumentException("错误!");
           
            ViewData["Title"] = "This was cached at "+DateTime.Now;
            return View();
        }

 

实现自己的FILTER

继承ActionFilterAttribute类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Diagnostics;

namespace NerdDinner.Models
{
    public class MyFilterAttribute:ActionFilterAttribute
    {
        public MyFilterAttribute()
        {
            this.Order = int.MaxValue;
        }
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var controler = filterContext.Controller;
            if (controler != null)
            {
                var stopwatch = new Stopwatch();
                controler.ViewData["stopwatch"] = stopwatch;
                stopwatch.Start();
            }
        }
        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            var controler = filterContext.Controller;
            if (controler != null)
            {
                var stopwatch = (Stopwatch)controler.ViewData["stopwatch"];
                stopwatch.Stop();
                controler.ViewData["duration"] = stopwatch.Elapsed.TotalMilliseconds;
               
            }
        }
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {

        }
        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {

        }
    }
}

备注:

Stopwatch 实例可以测量一个时间间隔的运行时间,也可以测量多个时间间隔的总运行时间。在典型的 Stopwatch 方案中,先调用 Start 方法,然后调用 Stop 方法,最后使用 Elapsed 属性检查运行时间。

Stopwatch 实例或者在运行,或者已停止;使用 IsRunning 可以确定 Stopwatch 的当前状态。使用 Start 可以开始测量运行时间;使用 Stop 可以停止测量运行时间。通过属性 ElapsedElapsedMillisecondsElapsedTicks 查询运行时间值。当实例正在运行或已停止时,可以查询运行时间属性。运行时间属性在 Stopwatch 运行期间稳固递增;在该实例停止时保持不变。

默认情况下,Stopwatch 实例的运行时间值相当于所有测量的时间间隔的总和。每次调用 Start 时开始累计运行时间计数;每次调用 Stop 时结束当前时间间隔测量,并冻结累计运行时间值。使用 Reset 方法可以清除现有 Stopwatch 实例中的累计运行时间。

Stopwatch 在基础计时器机制中对计时器的刻度进行计数,从而测量运行时间。如果安装的硬件和操作系统支持高分辨率性能的计数器,则 Stopwatch 类将使用该计数器来测量运行时间;否则,Stopwatch 类将使用系统计数器来测量运行时间。使用 FrequencyIsHighResolution 字段可以确定实现 Stopwatch 计时的精度和分辨率。

Stopwatch 类为托管代码内与计时有关的性能计数器的操作提供帮助。具体说来,Frequency 字段和 GetTimestamp 方法可以用于替换非托管 Win32 API QueryPerformanceFrequencyQueryPerformanceCounter

 

实践,自己写一个LOG过滤器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Diagnostics;
using System.Web.Routing;

namespace NerdDinner.Models
{
    public class LogFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            Log("OnActionExecuting", filterContext.RouteData);
        }

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            Log("OnActionExecuted", filterContext.RouteData);
        }

        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            Log("OnResultExecuting", filterContext.RouteData);
        }

        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            Log("OnResultExecuted", filterContext.RouteData);
        }

        private void Log(string methodName, RouteData routeData)
        {
            var controllerName = routeData.Values["controller"];
            var actionName = routeData.Values["action"];
            var message = String.Format("{0} controller:{1} action:{2}", methodName, controllerName, actionName);
            Debug.WriteLine(message, "Action Filter Log");//在DEBUG模式下,可以用他来打出信息。
        }

    }
}

 

注释:通过ResultExecutingContext可以得到路由信息。

filterContext.RouteData

然后通过路由可以得到你的控制器名字和ACTION名字

var controllerName = routeData.Values["controller"];
            var actionName = routeData.Values["action"];

你可能感兴趣的:(mvc,Web,asp.net,asp,LINQ)