ASP.Net 5项目中为API与Web App配置不同运行域名的咨询
ASP.NET 5 项目API与Web App独立域名/端口部署实现方案
方案1:拆分独立项目部署(最推荐,扩展性强)
将API与Web App拆分为两个独立项目,分别启动监听对应端口:
- 新建独立的ASP.NET 5 Web API项目,迁移所有接口业务逻辑到该项目
- 配置项目启动端口:修改
Properties/launchSettings.json中的applicationUrl为http://localhost:5000 - 全局API路由加
/api前缀:给所有控制器基类加路由属性[Route("api/[controller]/[action]")],或在Program.cs中配置控制器路由规则:app.MapControllerRoute( name: "apiDefault", pattern: "api/{controller=Home}/{action=Index}/{id?}"); - 配置跨域策略,允许Web App端口请求:
// 服务注册阶段 builder.Services.AddCors(opt => opt.AddPolicy("AllowWebApp", policy => { policy.WithOrigins("http://localhost:60856") .AllowAnyHeader() .AllowAnyMethod(); })); // 中间件阶段,放在UseRouting之前 app.UseCors("AllowWebApp");
- 配置项目启动端口:修改
- 原Web App项目保留所有静态页面、前端路由逻辑,修改
Properties/launchSettings.json中的applicationUrl为http://localhost:60856即可 - 前端所有接口请求统一加
http://localhost:5000/api/前缀
方案2:单项目多端口监听(无需拆分代码)
如果不想拆分项目,可通过端口路由拦截实现隔离:
- 配置项目同时监听两个端口:修改Program.cs添加配置
也可以直接修改builder.WebHost.UseUrls("http://localhost:5000", "http://localhost:60856");launchSettings.json的applicationUrl为http://localhost:5000;http://localhost:60856 - 添加端口校验中间件,放在所有业务中间件之前,拦截不符合规则的请求:
app.Use(async (context, next) => { var requestPort = context.Connection.LocalPort; var path = context.Request.Path.Value ?? string.Empty; // 5000端口仅放行/api前缀的请求 if (requestPort == 5000 && !path.StartsWith("/api", StringComparison.OrdinalIgnoreCase)) { context.Response.StatusCode = 404; return; } // 60856端口禁止访问/api前缀的请求 if (requestPort == 60856 && path.StartsWith("/api", StringComparison.OrdinalIgnoreCase)) { context.Response.StatusCode = 404; return; } await next(); });
生产环境优化方案
生产环境无需修改代码逻辑,直接用反向代理实现即可:
- 用Nginx、IIS、Apache等反向代理服务,配置两条转发规则:
- 所有
http://localhost:5000/api/*的请求转发到后端服务的对应接口路径 - 所有
http://localhost:60856/*的请求转发到Web App的静态资源/前端路由路径即可
- 所有
内容的提问来源于stack exchange,提问作者Shashwat Prakash
相关产品推荐
相关产品推荐

