.NET 4.8 WebAPI使用Swashbuckle 5.6.0访问swagger报403.14错误
这个错误和Swagger授权规则没有关系,本质是请求没有命中Swagger的路由管道,被IIS/IIS Express当成了访问物理目录的请求,按以下优先级排查即可:
1. 确认Swagger配置已在Global.asax中注册
这是最高发的漏项:Nuget包安装时只会自动生成SwaggerConfig.cs,不会自动在启动管道里加注册代码。
打开项目根目录的Global.asax.cs,在Application_Start方法中补全注册逻辑,注意Swagger注册必须放在WebApi路由注册之后:
protected void Application_Start() { // 原有配置,比如区域注册、过滤器注册、WebApi路由注册 GlobalConfiguration.Configure(WebApiConfig.Register); // 必须手动加这行,Swagger配置才会生效 SwaggerConfig.Register(); }
2. 排查路由拦截冲突
你提到启动后默认跳转到about2.aspx,说明项目里存在全局路由(大概率是WebForm路由或者自定义URL重写规则)拦截了根路径下的请求,把swagger请求转发到了aspx处理逻辑或者静态文件处理逻辑:
- 打开
App_Start/RouteConfig.cs(WebForm+WebAPI混合项目会存在这个文件),在所有路由规则最前面加忽略规则,跳过swagger路径的路由匹配:
routes.IgnoreRoute("swagger/{*pathInfo}");
- 打开
Web.config检查<system.webServer>/<rewrite>节点,如果有全局URL重写规则,加一条排除条件,不对/swagger开头的请求做重写。
3. 修正IIS托管管道配置
Swashbuckle依赖托管模块拦截请求,如果管道配置不对,请求会直接走静态文件处理逻辑,去找物理目录下的swagger文件夹,找不到就返回403.14:
打开根目录Web.config,找到<system.webServer>节点,将modules配置的runAllManagedModulesForAllRequests设为true:
<system.webServer> <modules runAllManagedModulesForAllRequests="true"> <!-- 保留原有模块配置即可 --> </modules> <handlers> <!-- 检查有没有自定义handler把swagger路径映射到StaticFileHandler,有的话删掉这条规则 --> </handlers> </system.webServer>
不需要开启目录浏览功能,这个配置开启后所有请求都会走.NET托管管道,Swagger的路由就能正常命中,和.NET Core项目不需要额外配置的逻辑一致。
4. 确认SwaggerConfig默认配置未被注释
很多版本的Swashbuckle 5.x生成的默认SwaggerConfig.cs里,核心的EnableSwagger、EnableSwaggerUi配置段是被注释在/* */代码块里的,打开App_Start/SwaggerConfig.cs,取消这两段的注释,不需要改其他默认参数,保留默认配置即可。
注意不要手动在项目任何静态文件目录(根目录、Areas目录、Content目录等)下创建名为swagger的物理文件夹,只要存在同名物理路径,IIS会优先匹配物理目录,直接返回目录访问错误,不会进入路由逻辑。
5. 清理本地调试缓存
退出所有运行中的IIS Express进程,除了删除.vs文件夹,还要清理项目bin、obj目录,重新生成解决方案;如果还是不行,删除%userprofile%\Documents\IISExpress\config\applicationhost.config里当前项目对应的站点配置段,重启VS重新启动调试即可。
补充说明:Swashbuckle 5.6.0默认没有开启任何授权限制,只要路由能正常命中,哪怕没有配置XML注释文档,也能正常打开Swagger UI页面,不会返回权限类错误。访问/swagger/ui/index依旧报错的核心原因就是请求根本没进到Swagger的处理逻辑里,全被前面的管道拦截成静态目录请求了。
内容的提问来源于stack exchange,提问作者Hank

