本文以 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 預設自帶的介面已經不見了。