Swagger 隐藏具体API
一、why
在swagger ui界面中有时候不想显示某些api,通过下面的方式可以实现。
1.1、新建一个类实现IDocumentFilter接口
using Swashbuckle.Swagger; using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Http.Description; namespace InvoiceApi.InvoiceHelper { /// <summary> /// 隐藏接口,不生成到swagger文档展示 /// </summary> [System.AttributeUsage(System.AttributeTargets.Method | System.AttributeTargets.Class)] public partial class HiddenApiAttribute : System.Attribute { } public class HiddenApiFilter : IDocumentFilter { public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer) { foreach (ApiDescription apiDescription in apiExplorer.ApiDescriptions) { if (Enumerable.OfType<HiddenApiAttribute>(apiDescription.GetControllerAndActionAttributes<HiddenApiAttribute>()).Any()) { string key = "/" + apiDescription.RelativePath; if (key.Contains("?")) { int idx = key.IndexOf("?", System.StringComparison.Ordinal); key = key.Substring(0, idx); } swaggerDoc.paths.Remove(key); } } } } }
1.2、在SwaggerConfig修改配置
1.3、在想隐藏的api上面添加特性 [HiddenApi]
using InvoiceApi.InvoiceHelper; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Web.Http; namespace InvoiceApi.Controllers { public class DownController : ApiController { /// <summary> /// 下载api参数文档 /// </summary> /// <returns></returns> [HttpGet] [HiddenApi] public HttpResponseMessage DownloadDoc() { try { var FilePath = System.Web.Hosting.HostingEnvironment.MapPath(@"~/Doc/api参数说明.docx"); var stream = new FileStream(FilePath, FileMode.Open); HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK); response.Content = new StreamContent(stream); response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "纸质发票参数API文档.doc", }; return response; } catch { return new HttpResponseMessage(HttpStatusCode.NoContent); } } } }