zoukankan      html  css  js  c++  java
  • ASP.NET Web API 中使用 swagger 来管理 API 文档

    本文以 ASP.NET Web API 为后台框架,利用 EF6 连接 postgreSQL 数据库,使用 swagger 来生成 REST APIs文档。文章分二个部分,第一部分主要讲如何用 EF6 连接 postgreSQL,第二部分是介绍如何集成 swagger,如何屏蔽 swagger 默认自带的接口说明。

    一、EF6 连接 postgreSQL 

    (1)使用 NuGet 安装 Npgsql.EntityFramework

    在VS的程序包管理控制台输入如下命令

    Install-Package Npgsql.EntityFramework

    (2)配置 Web.config

    利用 NuGet 安装的 EntityFramework,大部分配置都会自动在 Web.config 中生成,但却不会生成 DbProviderFactories,咱们手动把 DbProviderFactories 加上。数据库的连接信息也需要手动配置,在这里一并配置。配置如下:

     1 <system.data>
     2     <DbProviderFactories>
     3         <remove invariant="Npgsql" />
     4         <add name="Npgsql" invariant="Npgsql" description=".Net Framework Data Provider for Postgresql" type="Npgsql.NpgsqlFactory, Npgsql" />
     5     </DbProviderFactories>
     6 </system.data>
     7 <connectionStrings>
     8     <!--  数据库连接字符串, 包含主机,端口,用户,密码 -->
     9     <add name="DbConn" connectionString="Server=localhost;Port=5432;User Id=postgres; Password = postgres; Database=postgres" providerName="Npgsql"/>
    10 </connectionStrings>

    (3)新建 数据库上下文(DbContext)类

     1 // 数据库上下文 DB.cs
     2 public class DB : DbContext
     3 {
     4     public DB() : base("name = DbConn") {}
     5     protected override void OnModelCreating(DbModelBuilder modelBuilder)
     6     {
     7         //设置 EF 的默认schema
     8         modelBuilder.HasDefaultSchema("public");
     9     }
    10     // 实体类 (demo为表名)
    11     public virtual DbSet<demo> demo { get; set; }
    12 }

    (4)新建实体类 demo

    1 public class demo
    2 {
    3     [Key]
    4     [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    5     public string id { get; set; }
    6 
    7     [Required]
    8     public string name { get; set; }
    9 }

    (5)改写 ValuesController

    1 public List<demo> Get()
    2 {
    3     using (DB db = new DB())
    4     {
    5         return db.demo.ToList();
    6     }
    7 }

    (7)测试数据连接是否正常

    浏览器中输入 http://localhost:46665/api/Values,如果能看到有数据库中的数据返回,表示数据访问正常。

    二、集成 swagger

     (1)安装  swagger

    Install-Package Swashbuckle

    (2)配置 xml 生成 路径

    选中项目—>右键—>项目属性—>生成—>勾选(XML文档文件)—>保存

    (3)查看结果 

       浏览器中输入 http://localhost:46665/swagger/ui/index

       PS:运行中如果出现错误,找到 SwaggerNet 类,注释类上面的两行       

    // [assembly: WebActivator.PreApplicationStartMethod(typeof(webApi.App_Start.SwaggerNet), "PreStart")]
    // [assembly: WebActivator.PostApplicationStartMethod(typeof(webApi.App_Start.SwaggerNet), "PostStart")]    

    (4)swagger 中显示接口注释信息

     1 public class SwaggerConfig
     2 {
     3     public static void Register()
     4     {
     5         var thisAssembly = typeof(SwaggerConfig).Assembly;
     6 
     7         GlobalConfiguration.Configuration 
     8             .EnableSwagger(c =>{
     9                                c.SingleApiVersion("v1", "webApi");
    10                                //添加XML解析
    11                                //注意修改相应的XML名字
    12                                c.IncludeXmlComments(string.Format("{0}/bin/webApi.XML", System.AppDomain.CurrentDomain.BaseDirectory));
    13              }).EnableSwaggerUi(c =>{});
    14     }
    15 }

    到此,swagger 已经能生成文档了,但这时候生成的文档中会包含 swagger 默认自带的接口,看起来有点别扭。下面介绍下屏蔽 swagger 默认自带的接口。

    在 SwaggerConfig 中添加 DocumentFilter。

     1 public class SwaggerConfig
     2 {
     3     public static void Register()
     4     {
     5         var thisAssembly = typeof(SwaggerConfig).Assembly;
     6 
     7         GlobalConfiguration.Configuration 
     8             .EnableSwagger(c =>{
     9                                c.SingleApiVersion("v1", "webApi");
    10                                //添加XML解析
    11                                //注意修改相应的XML名字
    12                                c.IncludeXmlComments(string.Format("{0}/bin/webApi.XML", System.AppDomain.CurrentDomain.BaseDirectory));
    13                                // 接口过滤
    14                                c.DocumentFilter<ApiFilter>();
    15              }).EnableSwaggerUi(c =>{});
    16     }
    17 }
     1 // ApiFilter.cs
     2 [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]   
     3 public partial class ApiAttribute : Attribute { }
     4 public class ApiFilter: IDocumentFilter
     5 {
     6     public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
     7     {
     8          foreach (ApiDescription apiDescription in apiExplorer.ApiDescriptions)
     9          {        
    10             // url 过滤
    11             var _key = "/" + apiDescription.RelativePath.TrimEnd('/');
    12             if (_key.Contains("/api/Swagger") && swaggerDoc.paths.ContainsKey(_key))
    13                swaggerDoc.paths.Remove(_key);
    14           }
    15     }
    16 }

    重新运行下,swagger 默认自带的接口已经不见了。
  • 相关阅读:
    Netty源码剖析-关闭服务
    Netty源码剖析-断开连接
    Netty源码剖析-发送数据
    Netty源码剖析-业务处理
    Netty源码剖析-接受数据
    Netty源码剖析-构建链接
    html中调用silverlight中的方法
    在Silverlight宿主html页面添加按钮无法显示
    win7旗舰版在安装vs2010后向sql2008添加SQL_Server_Management详解
    javascript arguments
  • 原文地址:https://www.cnblogs.com/lifefriend/p/10205810.html
Copyright © 2011-2022 走看看