WebApi全局异常处理方式

自定义错误消息

 public class ErrorMessage:DelegatingHandler
    {

        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>((responseToCompleteTask) =>
            {
                HttpResponseMessage response = responseToCompleteTask.Result;
                HttpError error = null;
                if (response.TryGetContentValue<HttpError>(out error))
                {
                    //自定义错误处理
                    //error.Message = "这个接口调用出错了";
                }
                if (error != null)
                {   //这是本人创建的一个返回类
                    var resultMsg = new BaseResModel<BaseModel> { errorno = (int)response.StatusCode, page = -1, total = -1, records = -1 };
                    return new HttpResponseMessage
                    {
                        Content = new StringContent(SerializeUtils<BaseResModel<BaseModel>>.Serialize(resultMsg),
                        System.Text.Encoding.GetEncoding("UTF-8"), "application/json"),
                        StatusCode = HttpStatusCode.OK
                    };
                }
                else
                {
                    return response;
                }
            });
        }
    }

全局异常处理包括404

public class NotFoundActionSelector: ApiControllerActionSelector
    {
        public override HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
        {
            HttpActionDescriptor decriptor = null;
            try
            {
                decriptor = base.SelectAction(controllerContext);
            }
            catch (HttpResponseException ex)
            {
                var code = ex.Response.StatusCode;
                if (code != HttpStatusCode.NotFound && code != HttpStatusCode.MethodNotAllowed)
                    throw;
                var routeData = controllerContext.RouteData;
                routeData.Values["action"] = "Handle404";
                IHttpController httpController = new ErrorController();
                controllerContext.Controller = httpController;
                controllerContext.ControllerDescriptor = new HttpControllerDescriptor(controllerContext.Configuration, "Error", httpController.GetType());
                decriptor = base.SelectAction(controllerContext);
            }
            return decriptor;
        }
    }

  

public class NotFoundControllerSelector : DefaultHttpControllerSelector
    {
        public NotFoundControllerSelector(HttpConfiguration configuration)
            : base(configuration)
        {
        }

        public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
        {
            HttpControllerDescriptor decriptor = null;
            try
            {
                decriptor = base.SelectController(request);
            }
            catch (HttpResponseException ex)
            {
                var code = ex.Response.StatusCode;
                if (code != HttpStatusCode.NotFound)
                    throw;
                var routeValues = request.GetRouteData().Values;
                routeValues["controller"] = "Error";
                routeValues["action"] = "Handle404";
                decriptor = base.SelectController(request);
            }
            return decriptor;
        }
    }

权限过滤

public class SupportFilter : AuthorizeAttribute
    {
        //重写基类的验证方式,加入我们自定义的Ticket验证
        RedisHelper redis = new RedisHelper(1);
        public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            //url获取token
            var content = actionContext.Request.Properties["MS_HttpContext"] as HttpContextBase;

            var token = content.Request.QueryString["Token"];
            var userid = content.Request.QueryString["userid"] != null ? int.Parse(content.Request.QueryString["userid"]) : 0;
            var mac = content.Request.QueryString["mac"] != null ? content.Request.QueryString["mac"] : null;
            var routes = new RouteCollection();
            RouteConfig.RegisterRoutes(routes);
            RouteData routeData = routes.GetRouteData(content);
            //取出区域的控制器Action,id
            string controller = actionContext.ActionDescriptor.ControllerDescriptor.ControllerName;
            string action = actionContext.ActionDescriptor.ActionName;
            //URL路径
            string filePath = HttpContext.Current.Request.FilePath;

            if ((controller.ToLower() == "user" && action.ToLower() == "login")
                || (controller.ToLower() == "user" && action.ToLower() == "register" )|| (controller.ToLower() == "banner" && action.ToLower() == "getbanner") || (controller.ToLower() == "device" && action.ToLower() == "login"))

            {

            }
            else
            {
                var attributes = actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().OfType<AllowAnonymousAttribute>();
                bool isAnonymous = attributes.Any(a => a is AllowAnonymousAttribute);
                if (isAnonymous) base.OnAuthorization(actionContext);
                if (userid != 0 && token != null && token.Length > 0)
                {
                    if (redis.StringGet("user_token_" + userid.ToString()) != token)
                    {
                        HandleUnauthorizedRequest(actionContext);
                    }
                }
                else if (mac != null && token != null && token.Length > 0)
                {
                    if (redis.StringGet("device_token_" + mac) != token)
                    {
                        HandleUnauthorizedRequest(actionContext);
                    }
                }
                else
                    HandleUnauthorizedRequest(actionContext);

            }
        }
        protected override void HandleUnauthorizedRequest(HttpActionContext actionContext)
        {
            base.HandleUnauthorizedRequest(actionContext);
            if (actionContext.Response.StatusCode == System.Net.HttpStatusCode.Unauthorized)
            {

                actionContext.Response.Content = new StringContent(SerializeUtils<BaseResModel<BaseModel>>.Serialize(new BaseModel() { errorno = -4, errormsg = "" }), System.Text.Encoding.UTF8, "application/json");
            }
        }
    }

  

  

在webconfig中配置

   config.MessageHandlers.Add(new ErrorMessage());
            config.Filters.Add(new SupportFilter());
            config.Services.Replace(typeof(IHttpControllerSelector), new NotFoundControllerSelector(config));
            config.Services.Replace(typeof(IHttpActionSelector), new NotFoundActionSelector());
            // Web API 路由
            config.MapHttpAttributeRoutes();

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

  

时间: 2024-08-07 19:52:30

WebApi全局异常处理方式的相关文章

SpringMVC 全局异常处理

在 JavaEE 项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一,维护的工作量也很大.SpringMvc 对于异常处理这块提供了支持,通过 SpringMvc 提供的全局异常处理机制,能够将所有类型的异常处从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护. 全局异常实现方式 Spring MVC

Asp.net Core WebApi 全局异常类

通过全局异常类,所有程序中遇到的错误都会被拦截,并友好的返回结果. 1.自定义一个全局异常处理类中间件 using Microsoft.AspNetCore.Http; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Threading.Tasks; using Syst

服务端增加WCF服务全局异常处理机制

转自:http://www.csframework.com/archive/1/arc-1-20150109-2193.htm 服务端增加WCF服务全局异常处理机制,任一WCF服务或接口方式出现异常,将统一调用WCF_ExceptionHandler.ProvideFault方法,因此不需要每个方法使用try catch写法. 1 /// <summary> 2 /// WCF服务端异常处理器 3 /// </summary> 4 public class WCF_Exceptio

mvc自定义全局异常处理

异常信息处理是任何网站必不可少的一个环节,怎么有效显示,记录,传递异常信息又成为重中之重的问题.本篇将基于上篇介绍的html2cancas截图功能,实现mvc自定义全局异常处理.先看一下最终实现效果:http://yanweidie.myscloud.cn/Home/Index 阅读目录 我理解中好的异常处理 自定义异常处理 问题拓展 总结 回到顶部 我理解中好的异常处理     好的异常信息处理应该具有以下几个优点 显示效果佳,而不是原生黄页 能够从异常中直接分析出异常源 能够记录传递异常信息

WEB 项目中的全局异常处理

在web 项目中,遇到异常一般有两种处理方式:try.....catch....:throw 通常情况下我们用try.....catch.... 对异常进行捕捉处理,可是在实际项目中随时的进行异常捕捉,会造成代码重复和繁杂,我们希望代码中只有业务相关的操作,所有的异常我们单独设立一个类来处理它. 首先,我们在可能发生异常的方法,全部throw出来,即dao抛给service.service给controller.controller抛给前端控制器: 然后由前端控制器调用 全局异常处理器  对异常

全局异常方式处理自定义异常 @RestControllerAdvice + @ExceptionHandler

前言 本文讲解使用 @ControllerAdvice + @ExceptionHandler 进行全局的 Controller 层异常处理,可以处理大部分开发中用到的自自定义业务异常处理了,再也不用在 Controller 层进行 try-catch 了 文章结尾附带项目代码示例下载地址 一.处理思路 思路:在sevice业务逻辑层 try{}catch(){} 捕获抛出,经由contorller 层抛到 自定义全局处理类 中处理自定义异常及系统异常. 2.实现方式:使用 @RestContr

Spring中的统一异常处理方式

源自:https://segmentfault.com/a/1190000016236188 在具体的SSM项目开发中,由于Controller层为处于请求处理的最顶层,再往上就是框架代码的. 因此,肯定需要在Controller捕获所有异常,并且做适当处理,返回给前端一个友好的错误码. 不过,Controller一多,我们发现每个Controller里都有大量重复的.冗余的异常处理代码,很是啰嗦.能否将这些重复的部分抽取出来,这样保证Controller层更专注于业务逻辑的处理,同时能够使得异

springboot结合全局异常处理之登录注册验证

在学校做一个校企合作项目,注册登录这一块需要对注册登录进行输入合法的服务器端验证,因为是前后端分离开发,所以要求返回JSON数据. 方法有很多,这觉得用全局异常处理比较容易上手 全局异常处理 首先来创建一个sprIngboot的web项目或模块,目录结构如下 实体类User.java @Data public class User { private String userName; private String passwold; } 实体类UserResult.java 把数据封装到这里返回

Spring Boot 2 Webflux的全局异常处理

https://www.jianshu.com/p/6f631f3e00b9 本文首先将会回顾Spring 5之前的SpringMVC异常处理机制,然后主要讲解Spring Boot 2 Webflux的全局异常处理机制. SpringMVC的异常处理 Spring 统一异常处理有 3 种方式,分别为: 使用 @ExceptionHandler 注解 实现 HandlerExceptionResolver 接口 使用 @controlleradvice 注解 使用@ExceptionHandle