C# WebApi部署后Swagger损坏、接口缺失,无法读取swagger/docs/v1文件如何解决?
关于swagger/docs/v1路径的说明
swagger/docs/v1不是物理静态文件,是Swashbuckle组件在程序运行时动态生成的接口文档JSON的路由地址,不存在本地固定存放位置,也不需要你手动部署到服务器的指定路径。你看到的读取失败报错,本质是该动态接口在服务器环境运行时抛出了异常,无法正常返回JSON内容,Swagger UI解析失败就会出现接口缺失的问题。
解决方案
1. 开启Swagger错误详情定位根因
修改你的SwaggerConfig配置,新增错误详情输出配置,部署后直接访问http://192.168.19.3/WooService/swagger/docs/v1就能看到具体的报错信息:
GlobalConfiguration.Configuration .EnableSwagger(c => { c.SingleApiVersion("v1", "WooService"); // 新增此行,输出详细错误信息 c.IncludeErrorDetails(); }) .EnableSwaggerUi();
大部分本地正常、服务器异常的问题,都是因为服务器环境的路由规则、组件配置和本地开发环境不一致,通过该方法可以直接定位到具体的错误点。
2. 修复IIS路由拦截问题
服务器IIS默认的WebDAV模块会拦截GET、PUT等类型的请求,路由模块配置不全也会导致动态路由无法识别,修改项目Web.config的system.webServer节点即可解决:
<system.webServer> <modules runAllManagedModulesForAllRequests="true"> <!-- 移除拦截请求的WebDAV模块 --> <remove name="WebDAVModule"/> </modules> <handlers> <remove name="WebDAV" /> <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> </handlers> </system.webServer>
修改后重新部署,确认服务器IIS已经安装了对应.NET版本的ASP.NET路由模块。
3. 排查接口配置冲突
如果上述方法还是无效,检查新增的接口是否存在以下问题:
- 多个接口存在重复的
Route属性配置,或者相同的请求方式+路由路径 - 接口的参数/返回值存在Swagger无法序列化的类型,比如没有无参构造函数的自定义类、嵌套层级过深的泛型类型
Swashbuckle生成文档时遇到上述冲突会直接抛出异常,终止后续接口的扫描,就会出现仅加载部分接口的情况。
4. 检查XML注释文件部署(若开启)
如果后续你开启了Swagger XML注释配置,需要确认项目生成属性中勾选了「XML文档文件」,且部署时将生成的XML文件一同上传到服务器的bin目录,文件缺失也会导致文档生成失败。
内容的提问来源于stack exchange,提问作者bilpor
相关产品推荐
相关产品推荐

