1. 程式人生 > WINDOWS開發 >解決為MVC和WebAPi新增過濾器

解決為MVC和WebAPi新增過濾器

解決為MVC和WebAPi新增過濾器

Mvc的就直接在FilterConfig類的RegisterGlobalFilters方法中新增以下程式碼即可

Web Api的過濾器沒有單獨一個配置類,可以寫在WebApiConfig類的Register中

MVC過濾器

public class MvcHandleErrorAttribute : HandleErrorAttribute
    {
        public override void OnException(ExceptionContext filterContext)
        {
            //這裡可以做錯誤日誌處理或寫資料庫等操作
Console.WriteLine(filterContext.Exception.Message); base.OnException(filterContext); } }
public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            //filters.Add(new HandleErrorAttribute());
filters.Add(new MvcHandleErrorAttribute()); } }

WebApi過濾器

public class WebApiExceptionFilter : ExceptionFilterAttribute
    {
        public override void OnException(HttpActionExecutedContext context)
        {

            var message = context.Exception.Message;
            
if (context.Exception.InnerException != null) message = context.Exception.InnerException.Message; context.Response = new HttpResponseMessage() { Content = new StringContent(message) }; base.OnException(context); } }
public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            //是為了讓WebApi的控制器自動匹配ApiController
            var suffix = typeof(DefaultHttpControllerSelector).GetField("ControllerSuffix",BindingFlags.Static | BindingFlags.Public);
            if (suffix != null) suffix.SetValue(null,"ApiController");

            //為了讓WebApi也支援NameSpace
            config.Services.Replace(typeof(IHttpControllerSelector),new NamespaceHttpControllerSelector(config));

            //為WebApi新增過濾器
            config.Filters.Add(new WebApiExceptionFilter());

            // Web API 路由
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",routeTemplate: "api/{controller}/{id}",defaults: new { id = RouteParameter.Optional }
            );
        }
    }