.net swagger自动生成API接口文档

第一步安装swagger

.net swagger自动生成API接口文档_第1张图片

第二步:配置swagger

.net swagger自动生成API接口文档_第2张图片


[assembly: PreApplicationStartMethod(typeof(SwaggerConfig), "Register")]

namespace HCApi.WebApi
{
    public class SwaggerConfig
    {
        public static void Register()
        {
            var xmlFile = string.Format("{0}/bin/HCApi.WebApi.xml", System.AppDomain.CurrentDomain.BaseDirectory);
            var thisAssembly = typeof(SwaggerConfig).Assembly;

            GlobalConfiguration.Configuration
                .EnableSwagger(c =>
                    {
                        c.IncludeXmlComments(GetXmlCommentsPath("HCApi.EntityModel"));
                        c.SingleApiVersion("v1", "HCApi.WebApi").Description("项目API");
                        c.IncludeXmlComments(xmlFile);
                        c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
 //在接口类、方法标记属性[hiddenApi],可以阻止【Swagger文档】生成
                    c.DocumentFilter();
                    c.SchemaFilter();
                        c.CustomProvider((defaultProvider) => new HCApi.WebApi.App_Start.SwaggerControllerDescProvider(defaultProvider, xmlFile));
                        c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
                    })
                .EnableSwaggerUi(c =>
                    {
                        c.InjectJavaScript(Assembly.GetExecutingAssembly(), "HCApi.WebApi.SwaggerUI.swagger.js");
                    });
        }
        private static string GetXmlCommentsPath(string name)

        {
            return string.Format("{0}/bin/{1}.XML", System.AppDomain.CurrentDomain.BaseDirectory, name);
        }
    }
}
using System;
using System.IO;
using System.Web;
using System.Web.Http;
using System.Web.Http.Description;
using System.Web.Http.Dispatcher;
using System.Web.Routing;
using Swagger.Net;

//[assembly: WebActivator.PreApplicationStartMethod(typeof(HCApi.WebApi.App_Start.SwaggerNet), "PreStart")]
//[assembly: WebActivator.PostApplicationStartMethod(typeof(HCApi.WebApi.App_Start.SwaggerNet), "PostStart")]
namespace HCApi.WebApi.App_Start
{
    public static class SwaggerNet
    {
        public static void PreStart()
        {
            RouteTable.Routes.MapHttpRoute(
                name: "SwaggerApi",
                routeTemplate: "api/docs/{controller}",
                defaults: new { swagger = true }
            );
        }

        public static void PostStart()
        {
            var config = GlobalConfiguration.Configuration;

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

            try
            {
                config.Services.Replace(typeof(IDocumentationProvider),
                    new XmlCommentDocumentationProvider(HttpContext.Current.Server.MapPath("~/bin/HCApi.WebApi.XML")));
            }
            catch (FileNotFoundException)
            {
                throw new Exception("Please enable \"XML documentation file\" in project properties with default (bin\\HCApi.WebApi.XML) value or edit value in App_Start\\SwaggerNet.cs");
            }
        }
    }
}
    public class SwaggerControllerDescProvider : ISwaggerProvider
    {
        private readonly ISwaggerProvider _swaggerProvider;
        private static ConcurrentDictionary _cache = new ConcurrentDictionary();
        private readonly string _xml;
        /// 
        /// 
        /// 
        /// 
        /// xml文档路径
        public SwaggerControllerDescProvider(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 { { "ControllerDesc", GetControllerDesc() } };
                _cache.TryAdd(cacheKey, srcDoc);
            }
            return srcDoc;
        }

        /// 
        /// 从API文档中读取控制器描述
        /// 
        /// 所有控制器描述
        public ConcurrentDictionary GetControllerDesc()
        {
            string xmlpath = _xml;
            ConcurrentDictionary controllerDescDict = new ConcurrentDictionary();
            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;
        }
///    
/// 中文转换
///    
var SwaggerTranslator = (function () {
    //定时执行检测是否转换成中文,最多执行500次  即500*50/1000=25s
    var iexcute = 0,
        //中文语言包
        _words = {
            "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": "从路径",
            "Click to set as parameter value": "点击设置参数",
            "server returned": "服务器返回"
        },

        //定时执行转换
        _translator2Cn = function () {
            if ($("#resources_container .resource").length > 0) {
                _tryTranslate();
            }

            if ($("#explore").text() == "Explore" && iexcute < 500) {
                iexcute++;
                setTimeout(_translator2Cn, 50);
            }
        },

        //设置控制器注释
        _setControllerSummary = function () {
            $.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);
                            strSummary = summaryDict[controllerName];
                            if (strSummary) {
                                $(item).children(".heading").children(".options").prepend('
  • ' + strSummary + '
  • '); } } }); } }); }, //尝试将英文转换成中文 _tryTranslate = function () { $('[data-sw-translate]').each(function () { $(this).html(_getLangDesc($(this).html())); $(this).val(_getLangDesc($(this).val())); $(this).attr('title', _getLangDesc($(this).attr('title'))); }); }, _getLangDesc = function (word) { return _words[$.trim(word)] !== undefined ? _words[$.trim(word)] : word; }; return { Translator: function () { document.title = "API描述文档"; $('body').append(''); $("#logo").html("接口描述").attr("href", "/Home/Index"); //设置控制器描述 _setControllerSummary(); _translator2Cn(); } } })(); //执行转换 SwaggerTranslator.Translator();
       [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
        public partial class HiddenApiAttribute : Attribute { }
        public class HiddenApiFilter : IDocumentFilter
        {
            /// 
            /// 重写Apply方法,移除隐藏接口的生成
            /// 
            /// swagger文档文件
            /// 
            /// api接口集合
            public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
            {
                foreach (ApiDescription apiDescription in apiExplorer.ApiDescriptions)
                {
                    if (Enumerable.OfType(apiDescription.GetControllerAndActionAttributes()).Any())
                    {
                        string key = "/" + apiDescription.RelativePath;
                        if (key.Contains("?"))
                        {
                            int idx = key.IndexOf("?", StringComparison.Ordinal);
                            key = key.Substring(0, idx);
                        }
                        swaggerDoc.paths.Remove(key);
                    }
                }
            }
        }
        [AttributeUsage(AttributeTargets.Property)]
        public class SwaggerExcludeAttribute : Attribute { }
        public class SwaggerExcludeFilter : ISchemaFilter
        {
            #region ISchemaFilter Members
    
            public void Apply(Schema schema, SchemaRegistry schemaRegistry, Type type)
            {
                if (schema?.properties == null || type == null)
                    return;
    
                var excludedProperties = type.GetProperties()
                                             .Where(t =>
                                                    t.GetCustomAttribute()
                                                    != null);
    
                foreach (var excludedProperty in excludedProperties)
                {
                    if (schema.properties.ContainsKey(excludedProperty.Name))
                        schema.properties.Remove(excludedProperty.Name);
                }
            }
    
            #endregion
        }

    第三步:使用

      /// 
            /// 获取所有APP
            /// 
            /// 所有APP集合
            [HttpGet]
            public HttpResponseMessage Get()
            {
                return MyJson.ObjectToJson(GetApps());
            }
    
            /// 
            /// 获取指定APP
            /// 
            /// 需要获取APP的id
            /// 返回指定APP
            [SwaggerResponse(HttpStatusCode.OK, "返回APP列表", Type = typeof(App))]
            [HttpGet]
            public HttpResponseMessage Get(int id)
            {
                var app = GetApps().Where(m => m.Id.Equals(id)).FirstOrDefault();
                return MyJson.ObjectToJson(app);
            }
    
            /// 
            /// 增加App信息
            /// 
            /// 
            /// 
            [HttpPost]
            public HttpResponseMessage Insert([FromBody]App value)
            {
                ResultJson json = new ResultJson() { Code = 200, Message = "Ok" };
                return MyJson.ObjectToJson(json);
            }
    
            /// 
            /// 更新APP信息
            /// 
            /// APP信息
            /// 更新结果
            [HttpPut]
            public ResultJson UpdateApp([FromBody]App value)
            {
                ResultJson json = new ResultJson() { Code = 200, Message = "Ok" };
                return json;
            }
    
            /// 
            /// 删除APP信息
            /// 
            /// APP编号
            /// 删除结果
            [HttpDelete]
            public HttpResponseMessage DeleteApp(int id)
            {
                ResultJson json = new ResultJson() { Code = 200, Message = "Ok" };
                return MyJson.ObjectToJson(json);
            }
     /// 
        /// App信息
        /// 
        public class App
        {
            /// 
            /// App的ID号
            /// 
            public int Id { get; set; }
            /// 
            /// App的名称
            /// 
            public string Name { get; set; }
            /// 
            /// App的说明
            /// 
            public string Remark { get; set; }
        }
     /// 
        /// 返回处理结果
        /// 
        public class ResultJson
        {
            /// 
            /// 返回代码
            /// 
            public int Code { get; set; }
            /// 
            /// 返回消息
            /// 
            public string Message { get; set; }
        }
       public class MyJson
        {
            /// 
            /// 读取json信息
            /// 
            /// 传入对象
            /// 
            public static HttpResponseMessage ObjectToJson(object obj)
            {
                string r = JsonConvert.SerializeObject(obj);
                var result = new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new StringContent(r, Encoding.UTF8, "text/json")
                };
                return result;
            }
            public static HttpResponseMessage ObjectToJson(List objs)
            {
                string r = JsonConvert.SerializeObject(objs);
                var result = new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new StringContent(r, Encoding.UTF8, "text/json")
                };
                return result;
            }
        } 
      

    .net swagger自动生成API接口文档_第3张图片

    .net swagger自动生成API接口文档_第4张图片

    结束

    你可能感兴趣的:(插件运用)