• 生成自己的Webapi帮助文档(一)


    最近Webapi接口的开发刚刚进入尾声,随之而来的是让用户知道接口的详细参数信息,看过淘宝的接口文档,但网上没找到他的实现方式

    虽然新建Webapi时C#也会给你一个帮助文档的Area,但是总觉得有些太复杂了,实用性值得商榷,于是对他做了些阉割,就有了自己的一个版本。

    今天只完成了一些基本框架,具体细节有待进一步实现。

    总体思路如下:

    _thumb

    1:扩展HttpConfiguration的属性来加入自己的帮助文档生成器,

    2:在每个Controller中添加该Controller的帮助信息

    3:查看HTML时结合ApiDescription信息和2中添加的帮助信息来生成页面

    以下为一些代码:

    注册自定义帮助解析器:

    public static class HelpPageConfigurationExtensions
        {
            /// <summary>
            /// 添加Controller信息到文档生成器中
            /// </summary>
            /// <param name="config">The <see cref="HttpConfiguration"/>.</param>
            /// <param name="sampleObjects">The sample objects.</param>
            public static void SetSampleObjects(this System.Web.Http.HttpConfiguration config, ControllerDocumentModel controller)
            {
                config.GetHelpDocumentGenerator().Controllers.Add(controller);
            }
            /// <summary>
            /// 获取已经注册进来的帮助信息
            /// </summary>
            /// <param name="config"></param>
            /// <returns></returns>
            public static List<ControllerDocumentModel> GetSampleObjects(this System.Web.Http.HttpConfiguration config)
            {
                return config.GetHelpDocumentGenerator().Controllers;
            }
    
            /// <summary>
            /// 在属性中添加文档生成器
            /// </summary>
            /// <param name="config">The <see cref="HttpConfiguration"/>.</param>
            /// <returns>The help page sample generator.</returns>
            public static ApiHelpDocumentGenerator GetHelpDocumentGenerator(this System.Web.Http.HttpConfiguration config)
            {
                return (ApiHelpDocumentGenerator)config.Properties.GetOrAdd(
                    typeof(ApiHelpDocumentGenerator),
                    k => new ApiHelpDocumentGenerator());
            }
        }

    每个Controller都会实现一个虚方法,所以这里可以反射来统一调用,把每个Controller的帮助信息添加到生成器的列表中。

    public class ApiHelpDocumentRegister
        {
            public static void Regist(System.Web.Http.HttpConfiguration config)
            {
                var asm = System.Reflection.Assembly.GetExecutingAssembly();
    
                var controllerTypeList = asm.GetTypes().Where(x => x.BaseType == typeof(_BaseApiController));
                
                foreach (var controllerType in controllerTypeList)
                {
                    var controller = asm.CreateInstance(controllerType.FullName);
    
                    var method = controllerType.GetMethod("CreateApiHelpDocument", 
                        System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
    
                    try
                    {
                        var result = method.Invoke(controller, null);
    
                        config.SetSampleObjects(result as ControllerDocumentModel);
                    }
                    catch (NotImplementedException ex)
                    {
                        //未实现该方法
                    }
                    catch (Exception ex)
                    {
                        //其它异常
                    }
                }
            }
        }

    Controller自定义帮助内容

    public class ControllerDocumentModel
        {
            public ControllerDocumentModel()
            {
                Actions = new List<ActionDocumentModel>();
            }
            /// <summary>
            /// Controller名称
            /// </summary>
            public string ControllerName { get; set; }
            /// <summary>
            /// Controller说明
            /// </summary>
            public string ControllerSummary { get; set; }
            /// <summary>
            /// Action列表
            /// </summary>
            public List<ActionDocumentModel> Actions { get; set; }
        }

    Action自定义帮助内容

    public class ActionDocumentModel
        {
            public ActionDocumentModel()
            {
                Params = new List<ParamDocumentModel>();
            }
            /// <summary>
            /// Action名称
            /// </summary>
            public string ActionName { get; set; }
            /// <summary>
            /// Action说明
            /// </summary>
            public string ActionSummary { get; set; }
            /// <summary>
            /// Action参数列表
            /// </summary>
            public List<ParamDocumentModel> Params { get; set; }
            /// <summary>
            /// 返回值类型
            /// </summary>
            public Type ReturnValueType { get; set; }
            /// <summary>
            /// 返回值说明
            /// </summary>
            public string ReturnValueSummary { get; set; }
            /// <summary>
            /// 正常返回值示例
            /// </summary>
            public object ReturnValueSampleObject_Success { get; set; }
            /// <summary>
            /// 发生错误时的返回值示例
            /// </summary>
            public object ReturnValueSampleObject_Failed { get; set; }
        }
     
     
    参数自定义帮助:
    public class ParamDocumentModel
        {
            /// <summary>
            /// 参数名称
            /// </summary>
            public string ParamName { get; set; }
            /// <summary>
            /// 参数来源
            /// </summary>
            public ParameterBindings ParameterBinding { get; set; }
            /// <summary>
            /// 参数说明
            /// </summary>
            public string ParamSummary { get; set; }
            /// <summary>
            /// 参数类型
            /// </summary>
            public Type ParamType { get; set; }
            /// <summary>
            /// 参数示例数据
            /// </summary>
            public object ParamSampleObject { get; set; }
        }


    
    
    
    
  • 相关阅读:
    基线 css
    a与a:link、a:visited、a:hover、a:active
    去除iPhone的默认input样式
    iphone 数字字段颜色兼容问题
    javascript高级程序设计
    a标签 打电话 发邮件
    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
    先编写函数EncryptChar,按照下述规则将给定的字符c转化(加密)为新的字符
    一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3。编程找出1000以内的所有完数。
    古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
  • 原文地址:https://www.cnblogs.com/smlheart/p/3531552.html
Copyright © 2020-2023  润新知