如何将Swagger UI及C# API项目部署到公网服务器?
一、部署前本地预校验
先把本地配置调整到位,避免部署后出现基础问题:
- 放开Swagger的生产环境限制:默认C#项目的Swagger配置只会在开发环境生效,必须修改Program.cs里的判断逻辑,否则部署后访问Swagger会直接404,参考配置:
// 不要只在Development环境启用Swagger if (app.Environment.IsDevelopment() || app.Environment.IsProduction()) { app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "API V1"); // 可选配置:把Swagger设为根路径访问,不用额外加/swagger后缀 // c.RoutePrefix = string.Empty; }); }
- 调整服务监听地址:不要只绑定localhost,部署时需要监听
0.0.0.0对应的端口,否则外网请求打不进来,可以在发布启动时加参数--urls "http://0.0.0.0:端口号"实现。 - 提前配置跨域规则:你的React前端托管在Netlife,和API域名不一致,必须在C#的CORS配置里把前端的Netlife域名加入允许列表,不要直接开全源允许,存在安全风险。
- 本地发布验证:在VS里右键API项目选择发布,选文件夹模式,匹配目标服务器的运行时(比如linux-x64、win-x64、arm64),发布完成后本地运行发布包内的dll文件,确认本地访问Swagger、调用接口都正常再上传部署。
注意:你当前用的Netlife是静态站点托管服务,只能跑前端静态资源,不支持.NET运行时,没法直接部署C#写的API。
二、低成本/免费托管方案推荐
按成本从低到高、运维复杂度从简到繁排序:
- 零成本PaaS方案:Render免费档,原生支持.NET 6/7/8项目部署,不需要自己维护服务器,免费档每月提供750小时运行时长,个人测试完全够用,唯一限制是15分钟无请求会自动休眠,首次冷启动需要等3-5秒加载。
- 永久免费自管方案:Oracle Cloud永久免费云服务器,注册通过后可免费拿到1核1G的ARM或x86实例,没有运行时长、休眠限制,只要不超配额就可以永久使用,仅注册时需要信用卡做身份验证,不会产生扣费。
- 低成本长期方案:各大云厂商的轻量应用服务器,学生档每月仅需几元到十几元,普通低配实例每月20-30元,完全掌控服务器环境,适合正式上线的小型项目。
三、具体部署操作流程
方案1:Render平台部署(零运维,10分钟可完成)
- 把本地API代码推送到GitHub/GitLab的私有/公开仓库。
- 注册Render账号后选择新建Web Service,关联存储API代码的仓库。
- 填写部署配置:
- 运行环境选择.NET
- 构建命令填写
dotnet publish -c Release -o publish - 启动命令填写
dotnet publish/你的API项目入口dll名.dll --urls "http://0.0.0.0:$PORT" - 新增环境变量
ASPNETCORE_ENVIRONMENT=Production
- 点击部署等待2-3分钟构建完成,平台会自动分配一个二级域名,直接访问该域名加
/swagger路径就能打开Swagger页面,接口也可正常调用。 - 把React项目里的API请求地址替换为这个分配的域名,重新部署前端即可联调。
方案2:自管云服务器部署(无休眠,以Ubuntu系统为例)
- 服务器初始化完成后,安装对应版本的ASP.NET Core运行时即可,不需要安装完整SDK(SDK是开发环境用的,服务器装运行时就能运行发布好的程序)。
- 把本地验证通过的发布包通过scp或FTP传到服务器目录,比如
/var/www/myapi。 - 配置systemd守护进程,实现API开机自启、崩溃自动重启,参考配置:
# 配置文件路径 /etc/systemd/system/myapi.service [Unit] Description=C# API Service [Service] WorkingDirectory=/var/www/myapi ExecStart=/usr/bin/dotnet /var/www/myapi/你的API入口dll名.dll --urls "http://0.0.0.0:5000" Restart=always RestartSec=10 SyslogIdentifier=myapi User=www-data Environment=ASPNETCORE_ENVIRONMENT=Production [Install] WantedBy=multi-user.target
配置写完依次执行systemctl daemon-reload、systemctl enable myapi、systemctl start myapi启动服务。
- 安装Nginx做反向代理,把80/443端口的公网请求转发到本地5000端口的API服务,同时可以配置免费SSL证书开启HTTPS,核心配置参考:
server { listen 80; server_name 你的服务器公网IP/绑定的域名; location / { proxy_pass http://localhost:5000; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } }
- 在服务器安全组/防火墙规则里放开80、443端口,访问公网IP加
/swagger即可正常打开文档,最后把前端的API请求地址替换为该公网地址即可。
四、常见问题排查
- Swagger访问404:优先检查Program.cs里的Swagger配置是否限制了仅开发环境启用,其次检查反向代理是否拦截了
/swagger开头的请求路径。 - Swagger页面样式加载失败:检查反向代理的静态资源转发规则,确认
/swagger路径下的css、js文件没有被拦截。 - 前端调用接口报跨域错误:检查C#的CORS配置是否正确加入了前端的Netlife域名,注意不要同时开启
AllowCredentials和全源通配符,会触发跨域策略报错。 - 本地运行正常、服务器启动失败:检查发布时选择的运行时架构是否和服务器匹配,比如ARM架构的服务器不能运行x64架构的发布包。
- 不想Swagger被公开访问:可以在Nginx层给
/swagger路径加基础身份认证,输入正确用户名密码才能访问文档,避免接口信息泄露。
内容的提问来源于stack exchange,提问作者G-genius
相关产品推荐
相关产品推荐

