Swagger使用的奇淫技巧

一、背景


最近重构了公司一个老接口项目,弃用了原来的webservice服务,新项目用webapi写的。所以就有了 《Swagger使用的奇淫技巧》这篇文章。常规使用的技巧我这里就不在多赘述了,很多老鸟写的已经很详细了。这里我主要介绍下怎么使用VS remark 写MarkDown并且使用Swagger显示

二、ToDo


  • 新建一个WEB API项目,项目名称Demo

  • 引入Swagger

Install-Package Swashbuckle -ProjectName Demo -Version 5.6.0

  • 右键Demo项目-->生成-->勾选xml文档文件,ctrl+s保存

  • 打开App_Start文件夹,打开SwaggerConfig文件

添加方法GetXmlCommentsPath,并且打开c.IncludeXmlComments(GetXmlCommentsPath()); 这个配置

      public static string GetXmlCommentsPath()
        {
#if DEBUG
            return AppDomain.CurrentDomain.BaseDirectory + "\\bin\\demo.xml";\
#elif RELEASE
             return AppDomain.CurrentDomain.BaseDirectory + "\\bin\\Release\\demo.xml";

#else
            return AppDomain.CurrentDomain.BaseDirectory + "\\bin\\demo.xml";
#endif
        }
  • 打开App_Start文件夹,新建文件 FormatCommentProperties.cs,并引入Swashbuckle.Swagger 类库 ,并在SwaggerConfig文件中添加新指向XML描述过滤c.OperationFilter();
public class FormatCommentProperties : IOperationFilter
    {
        public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
        {
            operation.description = Formatted(operation.description);
            operation.summary = Formatted(operation.summary);
        }


        private string Formatted(string text)
        {
            if (text == null) return null;

            // Strip out the whitespace that messes up the markdown in the xml comments,
            // but don't touch the whitespace in <code> blocks. Those get fixed below.
            string resultString = Regex.Replace(text, @"(^[ \t]+)(?![^<]*>|[^>]*<\/)", "", RegexOptions.Multiline);
            resultString = Regex.Replace(resultString, @"<code[^>]*>", "``` C#", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Multiline);
            resultString = Regex.Replace(resultString, @"</code[^>]*>", "```", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Multiline);
            resultString = Regex.Replace(resultString, @"<!--", "", RegexOptions.Multiline);
            resultString = Regex.Replace(resultString, @"-->", "", RegexOptions.Multiline);

            try
            {
                string pattern = @"```(.*?)```";

                foreach (Match match in Regex.Matches(resultString, pattern, RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.Multiline))
                {
                    var formattedPreBlock = FormatPreBlock(match.Value);
                    resultString = System.Web.HttpUtility.HtmlDecode(resultString.Replace(match.Value, formattedPreBlock));
                }
                return resultString;
            }
            catch
            {
                // Something went wrong so just return the original resultString
                return resultString;
            }
        }

        private string FormatPreBlock(string preBlock)
        {
            // Split the <pre> block into multiple lines
            var linesArray = preBlock.Split('\n');
            if (linesArray.Length < 2)
            {
                return preBlock;
            }
            else
            {
                // Get the 1st line after the <pre>
                string line = linesArray[1];
                int lineLength = line.Length;
                string formattedLine = line.TrimStart(' ', '\t');
                int paddingLength = lineLength - formattedLine.Length;

                // Remove the padding from all of the lines in the <pre> block
                for (int i = 1; i < linesArray.Length - 1; i++)
                {
                    linesArray[i] = linesArray[i].Substring(paddingLength);
                }

                var formattedPreBlock = string.Join("", linesArray);
                return formattedPreBlock;
            }
        }
    }
  • 写注释

  • 现在启动站点

posted @ 2018-01-12 13:57  Router_Wu  阅读(231)  评论(0编辑  收藏  举报