webapi Filter

webapi的controller和action的控制。

 

使用场景:webapi接收到加密数据以及签名。验证签名是否有效。我们不能一个个action增加判断。

所以添加Filter是比较明智的方法。

 

首先 签名过滤器

namespace API.Filters
{
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
    public class APISignAttribute : ActionFilterAttribute
    {
        public static readonly string APISign = WebConfigurationManager.AppSettings["APISign"];

        public override void OnActionExecuting(HttpActionContext actionContext)
        {

            if (IsVaild(actionContext))
            {
                base.OnActionExecuting(actionContext);
            }
            else
            {
                throw new Exception("Invalid sign");
            }

        }

        public bool IsVaild(HttpActionContext actionContext)
        {
            var sign = HttpContext.Current.Request.Form["data"].ToString();
            //开始判断逻辑
            
            return false;
        }

        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            // 若发生例外则不在这边处理
            if (actionExecutedContext.Exception != null)
                return;

            base.OnActionExecuted(actionExecutedContext);
        }
    }
}

异常过滤器

public override void OnException(HttpActionExecutedContext actionExecutedContext)
        {
            base.OnException(actionExecutedContext);

            var result = new apiResult<object>()
            {
                code = HttpStatusCode.BadRequest,
                msg = actionExecutedContext.Exception.Message
            };
            if (actionExecutedContext.Exception is InvalidTokenException)
            {
                result.code = HttpStatusCode.Unauthorized;
            }
            string msg = "\r\n" + "apiErrorHandelattribute.StackTrace:\r\n" + actionExecutedContext.Exception.StackTrace + "\r\n\r\n" + "Message:\r\n" + actionExecutedContext.Exception.Message + "\r\n\r\n";
            LogerHelper.WriteLog(msg);

            // 重新打包回传的讯息
            actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(result.code, result);
            
        }

 

 

 

 

然后是启用方式,有2种

1 全局控制 在webapiConfig中添加

config.Filters.Add(new APISignAttribute());

 

 

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            //注册 sign统一验证
            config.Filters.Add(new APISignAttribute());

            //注册 api异常处理
            //config.Filters.Add(new ApiErrorHandleAttribute());
        }
    }


2 局部的控制

 

加在action上代表需要进入filter

加在controller上,代表该controller中所有action都要进入filter

 

[APISignAttribute]
    public class TestController : BaseControllerAPI
    {
        [HttpPost]
        public dynamic Get()
        {
            apiResult<dynamic> result = new apiResult<dynamic>();
            result.data= new List<string>() { "1", "2" };

            return result;

        }

        [APISignAttribute]
        [HttpGet]
        public dynamic haha()
        {
            return "value1";
        }
    }


结束大笑

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值