You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何手动将托管React静态文件的ASP.NET Core 5 WebAPI应用部署构建文件复制到Azure应用服务(App Service)

手动部署ASP.NET Core 5 + React应用到Linux Azure App Service

先明确前提:你本地已经完成了应用的构建和发布,接下来我们一步步完成手动部署,同时也会给你推荐替代的Azure服务选项。

一、手动复制文件的具体步骤

1. 本地准备好完整的发布包

  • 先发布ASP.NET Core WebAPI:在项目根目录执行命令
    dotnet publish -c Release -o ./publish
    
    这会在./publish目录生成所有运行必需的文件——包括可执行程序、运行时依赖库、配置文件等。
  • 整合React静态文件:如果你的React项目和WebAPI是同解决方案的,正常发布时应该已经自动把React构建产物(一般在build目录)复制到了WebAPI的wwwroot文件夹里;如果是分开开发的,手动把Reactbuild下的所有文件复制到./publish/wwwroot目录中,确保静态文件能被WebAPI正确访问。

2. 上传文件到Azure Linux App Service

Linux环境下的App Service,网站根目录是/home/site/wwwroot,你可以用以下两种方式手动上传:

  • 通过Kudu高级工具上传
    • 打开Azure门户,进入你的App Service实例,左侧菜单找到「开发工具」→「高级工具」,点击「Go」进入Kudu管理界面。
    • 顶部菜单选择「Debug console」→「Bash」,进入命令行界面后导航到site/wwwroot目录。
    • 点击界面上方的「Upload」按钮,选择本地publish目录下的所有文件(注意不要上传整个publish文件夹,而是里面的内容),上传完成后回到App Service门户,重启应用。
  • 通过FTP/SFTP上传
    • 在App Service的「部署中心」→「FTP凭据」里获取FTP主机地址、用户名和密码。
    • 用FTP客户端(比如FileZilla)连接到服务器,进入/site/wwwroot目录,把本地publish里的所有文件上传到这里,上传完成后重启App Service。

3. 关键检查项

  • 确认App Service的运行时配置:在「配置」→「常规设置」里,确保「.NET版本」选择的是「.NET 5 (Linux)」。
  • 验证静态文件中间件配置:检查WebAPI的Startup.csProgram.cs,确保已经配置了静态文件和SPA中间件,比如:
    app.UseStaticFiles();
    app.UseSpa(spa =>
    {
        spa.Options.SourcePath = "wwwroot";
        // 生产环境不需要开发环境的热重载配置
    });
    
    这样才能保证React的静态文件被正确返回,SPA路由也能正常工作。

二、手动部署不可行时的替代Azure服务

如果手动复制文件的方式不符合你的需求(比如需要自动化部署、更灵活的架构等),除了虚拟机,还有这些选项:

  • Azure Static Web Apps:专门为静态前端+后端API的组合设计,支持直接从GitHub/GitLab等代码仓库自动部署React静态文件,同时可以将ASP.NET Core API作为后端绑定,自带CDN、身份验证和环境隔离,配置简单,运维成本低。
  • Azure Container Apps:把你的应用打包成Docker容器,部署到Container Apps中。它不需要你管理虚拟机或Kubernetes集群,支持自动缩放、服务发现,适合需要容器化部署但不想承担复杂运维的场景。
  • Azure Kubernetes Service (AKS):如果你的应用是微服务架构,需要高级的容器编排能力(比如负载均衡、滚动更新、自动扩缩容),AKS是合适的选择,不过它的管理成本相对较高,适合规模较大的应用。
  • Azure Functions + Static Web Apps:如果你的WebAPI可以拆分成独立的无服务器函数,结合Static Web Apps托管React静态文件,这种无服务器架构可以按使用量付费,大幅降低运维成本,适合流量波动较大的应用。

内容的提问来源于stack exchange,提问作者Dalibor Čarapić

火山引擎 最新活动