• 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 = "
    " + "apiErrorHandelattribute.StackTrace:
    " + actionExecutedContext.Exception.StackTrace + "
    
    " + "Message:
    " + actionExecutedContext.Exception.Message + "
    
    ";
                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";
            }
        }

    结束大笑

  • 相关阅读:
    手把手教你创建ASP.NET MVC Dashboard应用
    DevExpress ASP.NET v20.2版本亮点放送:甘特图控件全面升级
    .NET 6已到来?Telerik WinForm率先支持
    手把手教你创建一个Vue Dashboard应用
    Kendo UI for jQuery数据管理使用教程:更改PivotGrid字段名称
    现代应用的启动屏幕如何更美观?这款第三方控件你使用了吗?
    VS插件CodeRush v20.2.8正式发布,支持新的代码模板
    这个三方控件,让你的ASP.NET应用图表界面更酷炫
    nginx负载均衡技术基础
    面向过程的代码请不要拆分成多个脚本
  • 原文地址:https://www.cnblogs.com/hanjun0612/p/9779861.html
Copyright © 2020-2023  润新知