<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Loading

      c# webapi 在swagger里添加全局過濾器

      Swagger原理

        Swagger就是利用反射技術遍歷所有Api接口,并且從xml文件中讀取注釋,在利用Swagger內置的模板組合html顯示至客戶端實現接口可視化,并且可調用。

      在WEB Api中,引入了面向切面編程(AOP)的思想,在某些特定的位置可以插入特定的Filter進行過程攔截處理。引入了這一機制可以更好地踐行DRY(Don’t Repeat Yourself)思想,通過Filter能統一地對一些通用邏輯進行處理,如:權限校驗、參數加解密、參數校驗等方面我們都可以利用這一特性進行統一處理,今天我們來介紹Filter的開發、使用以及討論他們的執行順序。

      Filter的開發和調用

      在默認的WebApi中,框架提供了三種Filter,他們的功能和運行條件如下表所示:

      Filter 類型實現的接口描述
      Authorization IAuthorizationFilter 最先運行的Filter,被用作請求權限校驗
      Action IActionFilter 在Action運行的前、后運行
      Exception IExceptionFilter 當異常發生的時候運行

      添加注冊全局Filter的方法

      1.創建一個ApiAuthorizationFilterAttribute.cs和ApiExceptionFilterAttribute.cs兩個文件:

      ApiAuthorizationFilterAttribute.cs文件如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      public class ApiAuthorizationFilterAttribute : AuthorizationFilterAttribute
      {
          public override void OnAuthorization(HttpActionContext actionContext)
          {
       
              //如果用戶方位的Action帶有AllowAnonymousAttribute,則不進行授權驗證
              if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any())
              {
                  return;
              }
       
              var authorization = actionContext.Request.Headers.Authorization;
       
              if (authorization == null || authorization.Scheme != "Bearer")
              {
                  actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized, new { status = "failed", message = "token不正確?。?!" });
              }
              else
              {
                  string username;
       
                  var token = authorization.Parameter;
            //以下就是驗證token的方法,可以自己寫方法進行驗證啦
                  if (!ValidateToken(token, out username))
                  {
                      actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized, new { status = "failed", message = "token不正確?。?!" });
                  }
              }
          }
      }

        ApiExceptionFilterAttribute.cs如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      /// <summary>
      /// 捕捉異常
      /// </summary>
      public class ApiExceptionFilterAttribute : ExceptionFilterAttribute
      {
          /// <summary>
          /// 重寫基類的異常處理方法
          /// </summary>
          /// <param name="context"></param>
          public override void OnException(HttpActionExecutedContext context)
          {
              //context.Exception.StackTrace
              //1.異常日志記錄
              LogHelper.Error(context.Exception.ToString());
       
              //2.返回調用方具體的異常信息
              if (context.Exception is NotImplementedException)
              {
                  context.Response = new HttpResponseMessage(HttpStatusCode.NotImplemented);
              }
              else if (context.Exception is TimeoutException)
              {
                  context.Response = new HttpResponseMessage(HttpStatusCode.RequestTimeout);
              }
              else
              {
                  //這里可以根據項目需要返回到客戶端特定的狀態碼。如果找不到相應的異常,統一返回服務端錯誤500
                  context.Response = new HttpResponseMessage(HttpStatusCode.InternalServerError);
              }
       
              base.OnException(context);
       
          }
       
          private JsonMediaTypeFormatter _JsonFormatter;
          private JsonMediaTypeFormatter JsonFormatter
          {
              get
              {
                  if (_JsonFormatter == null)
                  {
                      _JsonFormatter = new JsonMediaTypeFormatter();
                      _JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
                  }
                  return _JsonFormatter;
              }
          }
      }

      2.在WebApiConfig.cs文件中添加”注冊全局Filter“的那兩行

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      public static class WebApiConfig
      {
          public static void Register(HttpConfiguration config)
          {
              // Web API 配置和服務
       
              // Web API 路由
              config.MapHttpAttributeRoutes();
       
              //注冊全局Filter
              config.Filters.Add(new ApiAuthorizationFilterAttribute());
              config.Filters.Add(new ApiExceptionFilterAttribute());
       
              config.Routes.MapHttpRoute(
                  name: "DefaultApi",
                  routeTemplate: "api/{controller}/{id}",
                  defaults: new { id = RouteParameter.Optional }
              );
       
              log4net.Config.XmlConfigurator.Configure();
       
          }
      }

      3.進行swagger的相關配置,新建一個HttpHeaderFilter.cs文件:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      public class HttpHeaderFilter : IOperationFilter
      {
          public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
          {
              if (operation.parameters == null)
              {
                  operation.parameters = new List<Parameter>();
              }
       
              var filterPipeline = apiDescription.ActionDescriptor.GetFilterPipeline(); //判斷是否添加權限過濾器
              var isAuthorized = filterPipeline.Select(filterInfo => filterInfo.Instance).Any(filter => filter is ApiAuthorizationFilterAttribute); //判斷是否需要經過驗證
              var allowAnonymous = apiDescription.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any();//判斷是否否允許匿名方法
              if (isAuthorized && !allowAnonymous)
              {
                  operation.parameters.Add(new Parameter { name = "Authorization", @in "header", description = "Token", required = false, type = "string" });
              }
          }
      }

      4.在文件SwaggerConfig.cs文件中找到Register方法,GlobalConfiguration.Configuration.EnableSwagger中添加:

      1
      c.OperationFilter<HttpHeaderFilter>();

        大功告成,如下圖:

       

      posted @ 2023-11-10 11:09  jevan  閱讀(433)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产精品揄拍一区二区久久 | 亚洲人妻精品中文字幕| 国产色悠悠视频在线观看| 久久精品成人无码观看免费| 国产精品一区二区色综合| 宽城| 久久美女夜夜骚骚免费视频| 华坪县| 久久精品国产成人午夜福利| 肥东县| 18禁精品一区二区三区| 2021亚洲国产精品无码| 国产中文三级全黄| 无码囯产精品一区二区免费 | 色猫咪av在线网址| 蜜臀av一区二区三区在线| 国产欧亚州美日韩综合区| 亚洲高清WWW色好看美女| 人妻精品动漫H无码中字| 欧美亚洲国产精品久久| 大又大又粗又硬又爽少妇毛片| 亚洲第一区二区国产精品| 免费人成视频在线播放| 亚洲精品成人片在线观看精品字幕| 中文字幕亚洲精品人妻| 免费特黄夫妻生活片| 视频一区视频二区在线视频| 亚洲美女被黑人巨大在线播放| 国产高清自产拍av在线| 星座| 人人妻人人澡人人爽| 久久男人av资源站| 亚洲性一交一乱一伦视频| 香港日本三级亚洲三级| 盐源县| 久久人人爽爽人人爽人人片av| 国产精品老年自拍视频| 亚洲人成小说网站色在线| 野花社区www高清视频| 国产精品久久一区二区三区| 无码专区 人妻系列 在线|