Loading

swagger 的配置

1,开启swagger :

 c.IncludeXmlComments(GetXmlCommentsPath());

protected static string GetXmlCommentsPath()
{
return string.Format(@"{0}\bin\{1}.xml", System.AppDomain.CurrentDomain.BaseDirectory
, Assembly.GetExecutingAssembly().GetName().Name);
}

 

2,在外网访问时swagger提示错误:

当我尝试看到swagger UI时,我很好地获得了API的文档但是在一段时间后它在按钮上显示了一些错误图标 .

错误消息如下所示:

[{“level”:“error”,“message”:“无法从文件中读取http:// MYIP / swagger / docs / v1”}]

我不确定是什么导致它 . 如果我刷新它工作并在几秒后显示错误 .

可以对如下代码进行设置:

//c.SetValidatorUrl("http://localhost/validator");
c.DisableValidator();

 

3,在web项目下

a,找到Scripts目录

b,创建Swagger目录

c,创建 swagger_lang.js 文件,把 "swagger_lang.js" 文件的生成操作,改为  “嵌入的资源”

d,c.InjectJavaScript(thisAssembly, $"{thisAssembly.GetName().Name}.Scripts.Swagger.swagger_lang.js");

 

4,swagger 没有显示方法名

要在swagger文档中显示接口的方法名,只需修改路由模版就可以了。修改后的代码如下:

config.Routes.MapHttpRoute(
name: "DefaultApi",
//routeTemplate: "api/{controller}/{id}",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);

 5,swagger 添加 token

在 SwaggerConfig.cs  文件中,添加

c.OperationFilter<AuthTokenHeaderParameter>();

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http.Description;
using Swashbuckle.Swagger;

namespace Coordinator.MvcWebAPI
{
    public class AuthTokenHeaderParameter : IOperationFilter
    {
        public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
        {
            operation.parameters = operation.parameters ?? new List<Parameter>();
            ////var filterPipeline = apiDescription.ActionDescriptor.GetFilterPipeline(); //判断是否添加权限过滤器
            ////var isAuthorized = filterPipeline.Select(filterInfo => filterInfo.Instance).Any(filter => filter is IAuthorizationFilter); //判断是否允许匿名方法 
            var isNeedLogin = apiDescription.ActionDescriptor.GetCustomAttributes<AuthenticationAttribute>().Any(); 
            if (isNeedLogin)
            {
                operation.parameters.Add(
                    new Parameter
                    {
                        name = "Authorization",
                        @in = "header",
                        description = "Bearer Token",
                        required = true,
                        type = "string"
                    }
                );
            }
        }
    }
}

 

6,Controller 加备注信息,过滤掉部分 Controller 

c.DocumentFilter<ApplyDocumentVendorExtensions>();

    public class ApplyDocumentVendorExtensions : IDocumentFilter
    {
        public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
        {
            // Controller 加备注信息
            swaggerDoc.tags = new List<Tag>
            {
                new Tag{ name="Auth", description="安全认证中心"},
                new Tag{ name="Upload", description="文件传输接口" }
            };

            //过滤掉部分 Controller 
            //var paths = new Dictionary<string, PathItem>(swaggerDoc.paths);
            //swaggerDoc.paths.Clear();
            //foreach (var path in paths)
            //{
            //    if (path.Key.Contains("Values"))
            //        swaggerDoc.paths.Add(path);
            //}
        }
    }

 

posted @ 2020-05-25 15:19  Sam Xiao  阅读(530)  评论(0编辑  收藏  举报