<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 Area 多級層次分組 添加header參數

      nuget 安裝Swashbuckle

      安裝完成后會在App_Start中生成SwaggerConfig.cs

       項目右鍵屬性生成xml文件

       在SwaggerConfig中的Register中進行配置

      //在內部的GlobalConfiguration.Configuration.EnableSwagger中進行配置
      
      c.SingleApiVersion("v1", "API");
      var baseDiretory = System.AppDomain.CurrentDomain.BaseDirectory;
      var xmlFile = Path.Combine(baseDiretory, "bin\\API.xml");
      if (System.IO.File.Exists(xmlFile))
      {
          c.IncludeXmlComments(xmlFile);
      }
      //多個xml文件,或model與項目分離的時候都需要加載另外的xml
      var modelFile = Path.Combine(baseDiretory, "bin\\Model.xml");
      if (File.Exists(modelFile))
      {
          c.IncludeXmlComments(modelFile);
      }
      
      //解決同樣的接口名 傳遞不同參數
      c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
      //自定義provider,可以讓Controller的注釋也顯示出來
      c.CustomProvider((defaultProvider) => new SwaggerCacheProvider(defaultProvider, xmlFile));

      同時添加自定義方法對swagger的分組模式進行調整
      調整的方式為擴展類,代碼如下

      /// <summary>
          /// API描述器擴展
          /// </summary>
          public static class ApiDescriptionExtension
          {
              public static string GetAreaName(this ApiDescription description)
              {
                  string controllerFullName = description.ActionDescriptor.ControllerDescriptor.ControllerType.FullName;
      
                  //獲取控制器名稱
                  string controllerName = "";
                  int index = controllerFullName.LastIndexOf('.');
                  if (index != -1)
                  {
                      controllerName = controllerFullName.Substring(index + 1);
                      controllerName = controllerName.Replace("Controller", "");
                  }
      
                  //匹配areaName
                  //如果不包含area,則根據控制器名稱進行分組
                  string areaName = "";
                  if (controllerFullName.Contains(".Areas."))
                  {
                      //獲取area索引位置
                      index = controllerFullName.IndexOf(".Areas.");
                      areaName = controllerFullName.Substring(index + 7);
      
                      //獲取area名稱,解決多級目錄下area名稱不正確的問題
                      try
                      {
                          index = areaName.IndexOf('.');
                          areaName = areaName.Substring(0, index);
                      }
                      catch (System.Exception)
                      {
                      }
                  }
      
                  if (string.IsNullOrEmpty(areaName))
                  {
                      //若不是areas下的controller,將路由格式中的{area}去掉
                      description.RelativePath = description.RelativePath.Replace("{area}/", "");
                      return areaName;
                  }
                  //根據area分組
                  else
                  {
                      //string relativePath = $"{areaName}.{controllerName}";
                      //若是areas下的controller,將路由格式中的{area}替換為真實areaname
                      description.RelativePath = description.RelativePath.Replace("{area}", areaName);
                      //description.RelativePath = relativePath;
      
                      var findResult = description.ParameterDescriptions.Where(t => t.Name == "area");
                      if (findResult != null && findResult.Count() > 0)
                      {
                          description.ParameterDescriptions.Remove(findResult.First());
                      }
                      return areaName;
                  }
              }
              /// <summary>
              /// 獲取控制器名稱
              /// </summary>
              /// <param name="description"></param>
              /// <returns></returns>
              public static string GetControllerName(this ApiDescription description)
              {
                  string controllerFullName = description.ActionDescriptor.ControllerDescriptor.ControllerType.FullName;
                  string controllerName = controllerFullName;
      
                  if (!string.IsNullOrEmpty(controllerFullName))
                  {
                      int index = controllerFullName.LastIndexOf('.');
                      if (index != -1)
                      {
                          controllerName = controllerFullName.Substring(index + 1);
                          controllerName = controllerName.Replace("Controller", "");
                      }
                  }
                  return controllerName;
              }
          }

      如果需要按照area分組(多級層次分組),則使用下面的代碼

      string controllerFullName = description.ActionDescriptor.ControllerDescriptor.ControllerType.FullName;
      
                  //獲取控制器名稱
                  string controllerName = "";
                  int index = controllerFullName.LastIndexOf('.');
                  if (index != -1)
                  {
                      controllerName = controllerFullName.Substring(index + 1);
                      controllerName = controllerName.Replace("Controller", "");
                  }
      
                  //匹配areaName
                  //如果不包含area,則根據控制器名稱進行分組
                  string areaName = "";
                  if (controllerFullName.Contains(".Areas."))
                  {
                      //獲取area索引位置
                      index = controllerFullName.IndexOf(".Areas.");
                      areaName = controllerFullName.Substring(index + 7);
      
                      //獲取area名稱,解決多級目錄下area名稱不正確的問題
                      index = areaName.IndexOf('.');
                      areaName = areaName.Substring(0, index);
                  }
                  //= Regex.Match(controllerFullName, @"Area.([^,]+)\.C").Groups[1].ToString().Replace(".", "");
                  if (string.IsNullOrEmpty(areaName))
                  {
                      //若不是areas下的controller,將路由格式中的{area}去掉
                      description.RelativePath = description.RelativePath.Replace("{area}/", "");
                      return controllerName;
                  }
                  //根據area分組
                  else
                  {
                      //string relativePath = $"{areaName}.{controllerName}";
                      //若是areas下的controller,將路由格式中的{area}替換為真實areaname
                      description.RelativePath = description.RelativePath.Replace("{area}", areaName);
                      //description.RelativePath = relativePath;
      
                      var findResult = description.ParameterDescriptions.Where(t => t.Name == "area");
                      if (findResult != null && findResult.Count() > 0)
                      {
                          description.ParameterDescriptions.Remove(findResult.First());
                      }
                      return controllerName;
                      //return areaName;
                  }

      隨后添加調用,調用位置還為上面提到的內部的GlobalConfiguration.Configuration.EnableSwagger中進行配置

      //如果需要根據area的名稱過濾,可以使用
      //c.GroupActionsBy(apiDesc => apiDesc.GetAreaName());
      c.GroupActionsBy(apiDesc => apiDesc.GetControllerName());

      最后調整ui部分,使swagger顯示控制器的注釋并顯示中文
      首先添加一個provider,如下

      /// <summary>
          /// swagger顯示控制器的描述
          /// </summary>
          public class SwaggerCacheProvider : ISwaggerProvider
          {
              private readonly ISwaggerProvider _swaggerProvider;
              private static ConcurrentDictionary<string, SwaggerDocument> _cache = new ConcurrentDictionary<string, SwaggerDocument>();
              private readonly string _xml;
              /// <summary>
              /// 
              /// </summary>
              /// <param name="swaggerProvider"></param>
              /// <param name="xml">xml文檔路徑</param>
              public SwaggerCacheProvider(ISwaggerProvider swaggerProvider, string xml)
              {
                  _swaggerProvider = swaggerProvider;
                  _xml = xml;
              }
      
              public SwaggerDocument GetSwagger(string rootUrl, string apiVersion)
              {
      
                  var cacheKey = string.Format("{0}_{1}", rootUrl, apiVersion);
                  SwaggerDocument srcDoc = null;
                  //只讀取一次
                  if (!_cache.TryGetValue(cacheKey, out srcDoc))
                  {
                      srcDoc = _swaggerProvider.GetSwagger(rootUrl, apiVersion);
      
                      srcDoc.vendorExtensions = new Dictionary<string, object> { { "ControllerDesc", GetControllerDesc() } };
                      _cache.TryAdd(cacheKey, srcDoc);
                  }
                  return srcDoc;
              }
      
              /// <summary>
              /// 從API文檔中讀取控制器描述
              /// </summary>
              /// <returns>所有控制器描述</returns>
              public ConcurrentDictionary<string, string> GetControllerDesc()
              {
                  string xmlpath = _xml;
                  ConcurrentDictionary<string, string> controllerDescDict = new ConcurrentDictionary<string, string>();
                  if (File.Exists(xmlpath))
                  {
                      XmlDocument xmldoc = new XmlDocument();
                      xmldoc.Load(xmlpath);
                      string type = string.Empty, path = string.Empty, controllerName = string.Empty;
      
                      string[] arrPath;
                      int length = -1, cCount = "Controller".Length;
                      XmlNode summaryNode = null;
                      foreach (XmlNode node in xmldoc.SelectNodes("//member"))
                      {
                          type = node.Attributes["name"].Value;
                          if (type.StartsWith("T:"))
                          {
                              //控制器
                              arrPath = type.Split('.');
                              length = arrPath.Length;
                              controllerName = arrPath[length - 1];
                              if (controllerName.EndsWith("Controller"))
                              {
                                  //獲取控制器注釋
                                  summaryNode = node.SelectSingleNode("summary");
                                  string key = controllerName.Remove(controllerName.Length - cCount, cCount);
                                  if (summaryNode != null && !string.IsNullOrEmpty(summaryNode.InnerText) && !controllerDescDict.ContainsKey(key))
                                  {
                                      controllerDescDict.TryAdd(key, summaryNode.InnerText.Trim());
                                  }
                              }
                          }
                      }
                  }
                  return controllerDescDict;
              }
          }

      在項目根目錄添加swagger.js并將生成屬性調整為嵌入的資源,代碼如下

      'use strict';
      window.SwaggerTranslator = {
          _words: [],
      
          translate: function () {
              var $this = this;
              $('[data-sw-translate]').each(function () {
                  $(this).html($this._tryTranslate($(this).html()));
                  $(this).val($this._tryTranslate($(this).val()));
                  $(this).attr('title', $this._tryTranslate($(this).attr('title')));
              });
          },
      
          setControllerSummary: function () {
      
              try {
                  console.log($("#input_baseUrl").val());
                  $.ajax({
                      type: "get",
                      async: true,
                      url: $("#input_baseUrl").val(),
                      dataType: "json",
                      success: function (data) {
      
                          var summaryDict = data.ControllerDesc;
      
                          var id, controllerName, strSummary;
                          $("#resources_container .resource").each(function (i, item) {
                              id = $(item).attr("id");
      
                              if (id) {
                                  controllerName = id.substring(9);
      
                                  try {
                                      strSummary = summaryDict[controllerName];
      
                                      console.log(summaryDict);
      
                                      if (strSummary) {
                                          $(item).children(".heading").children(".options").first().prepend('<li class="controller-summary" style="color:green;" title="' + strSummary + '">' + strSummary + '</li>');
                                      }
                                  } catch (e) {
                                      console.log(e);
                                  }
                              }
                          });
                      }
                  });
              } catch (e) {
                  console.log(e);
              }
          },
          _tryTranslate: function (word) {
              return this._words[$.trim(word)] !== undefined ? this._words[$.trim(word)] : word;
          },
      
          learn: function (wordsMap) {
              this._words = wordsMap;
          }
      };
      
      
      /* jshint quotmark: double */
      window.SwaggerTranslator.learn({
          "Warning: Deprecated": "警告:已過時",
          "Implementation Notes": "實現備注",
          "Response Class": "響應類",
          "Status": "狀態",
          "Parameters": "參數",
          "Parameter": "參數",
          "Value": "值",
          "Description": "描述",
          "Parameter Type": "參數類型",
          "Data Type": "數據類型",
          "Response Messages": "響應消息",
          "HTTP Status Code": "HTTP狀態碼",
          "Reason": "原因",
          "Response Model": "響應模型",
          "Request URL": "請求URL",
          "Response Body": "響應體",
          "Response Code": "響應碼",
          "Response Headers": "響應頭",
          "Hide Response": "隱藏響應",
          "Headers": "頭",
          "Try it out!": "試一下!",
          "Show/Hide": "顯示/隱藏",
          "List Operations": "顯示操作",
          "Expand Operations": "展開操作",
          "Raw": "原始",
          "can't parse JSON.  Raw result": "無法解析JSON. 原始結果",
          "Model Schema": "模型架構",
          "Model": "模型",
          "apply": "應用",
          "Username": "用戶名",
          "Password": "密碼",
          "Terms of service": "服務條款",
          "Created by": "創建者",
          "See more at": "查看更多:",
          "Contact the developer": "聯系開發者",
          "api version": "api版本",
          "Response Content Type": "響應Content Type",
          "fetching resource": "正在獲取資源",
          "fetching resource list": "正在獲取資源列表",
          "Explore": "瀏覽",
          "Show Swagger Petstore Example Apis": "顯示 Swagger Petstore 示例 Apis",
          "Can't read from server.  It may not have the appropriate access-control-origin settings.": "無法從服務器讀取。可能沒有正確設置access-control-origin。",
          "Please specify the protocol for": "請指定協議:",
          "Can't read swagger JSON from": "無法讀取swagger JSON于",
          "Finished Loading Resource Information. Rendering Swagger UI": "已加載資源信息。正在渲染Swagger UI",
          "Unable to read api": "無法讀取api",
          "from path": "從路徑",
          "server returned": "服務器返回"
      });
      $(function () {
          window.SwaggerTranslator.translate();
          window.SwaggerTranslator.setControllerSummary();
      });

      隨后添加調用

      在上述的Register方法中尋找EnableSwaggerUi
      在內部添加調用

      c.InjectJavaScript(Assembly.GetExecutingAssembly(), "API.swagger.js");

      此處的API為項目名稱

      添加自定義過濾器,動態添加swagger頁面中的輸入框
      首先定義處理方法

      /// <summary>
          /// 添加自定義的頭部輸入框
          /// </summary>
          public class OptionalHeaderFilter : IOperationFilter
          {
              /// <summary>
              /// 是否包含頭部
              /// </summary>
              /// <param name="operation"></param>
              /// <param name="schemaRegistry"></param>
              /// <param name="apiDescription"></param>
              public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
      
              {
                  if (operation.parameters == null)
                      operation.parameters = new List<Parameter>();
      
                  var actionFilter = apiDescription.ActionDescriptor.GetCustomAttributes<SwaggerTokenFilter>().Any();
                  var controllerFilter = apiDescription.ActionDescriptor.ControllerDescriptor.GetCustomAttributes<SwaggerTokenFilter>(true).Any();
                  //添加頭部信息輸入框
                  if (actionFilter || controllerFilter)
                  {
                      //非必填字段可以設置為required=false
                      operation.parameters.Add(new Parameter { name = "introID", @in = "header", description = "introID", required = true, type = "string" });
                  }
      
              }
          }

      這里使用了SwaggerTokenFilter做檢測,可以根據具體使用添加多個過濾器
      隨后在swaggerConfig中添加

      c.OperationFilter<OptionalHeaderFilter>();

       

      posted @ 2023-11-10 11:00  jevan  閱讀(527)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 精品国产亚洲午夜精品a| 欧美成人午夜在线观看视频| 国产成人a∨激情视频厨房| 来凤县| 亚洲精品一区二区三区色| 东京热人妻丝袜无码AV一二三区观| 国产婷婷综合在线视频中文| 日韩av一中美av一中文字慕| 人人妻人人澡人人爽人人精品av| 久久亚洲精品天天综合网| 枣阳市| 亚洲中文字幕国产综合| 元码人妻精品一区二区三区9| 色综合久久久久综合99 | 亚洲精品成人片在线观看精品字幕| 久久这里只精品热免费99| 高清无码在线视频| 内射中出无码护士在线| 国产无遮挡无码视频在线观看| 亚洲精品一二三四区| 国内精品伊人久久久久AV一坑| 亚洲av成人免费在线| 久久精品一区二区日韩av| WWW丫丫国产成人精品| 少妇高潮激情一区二区三| 巨爆乳中文字幕爆乳区| 国产麻豆9l精品三级站| 久久久久噜噜噜亚洲熟女综合| 52熟女露脸国语对白视频| 亚洲avav天堂av在线网爱情| 免费成人网一区二区天堂| 乱色熟女综合一区二区三区| 国产三级精品三级色噜噜| 日韩中文字幕人妻精品| 亚洲制服无码一区二区三区| 美女午夜福利视频一区二区| 亚洲av无码专区在线亚| 国产一区二区三区色成人| 偷拍专区一区二区三区| 久热久热久热久热久热久热| 高清有码国产一区二区|