You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署.NET Blazor WebAssembly至Azure静态Web应用时API报404错误

问题

按照官方文档将.NET Blazor WebAssembly应用部署至Azure静态Web应用后,Web应用主页可正常访问,但所有API接口均返回404未找到错误。相关配置及代码如下:

GitLab CI配置文件 gitlab-ci.yaml

stages:
  - deploy

variables:
  API_TOKEN: $AZURE_STATIC_WEB_APPS_API_TOKEN
  APP_PATH: '$CI_PROJECT_DIR/ExpenseTracker.Client'
  OUTPUT_PATH: 'wwwroot'
  API_PATH: '$CI_PROJECT_DIR/ExpenseTracker.Server'
  PUBLISH_DIR: '$CI_PROJECT_DIR/publish'

deploy:
  stage: deploy
  image: registry.gitlab.com/static-web-apps/azure-static-web-apps-deploy
  script:
    - echo "App deployed successfully."

staticwebapp.config.json 文件

{
    "routes": [
        {
            "route": "/api/*",
            "serve": "/api"
        }
    ],
    "navigationFallback": {
        "rewrite": "/index.html"
    }
}

ExpenseTracker.Server 的 program.cs

using System.Text.Json.Serialization;
using DinkToPdf;
using DinkToPdf.Contracts;
using ExpenseTracker.Server.AppDbContext;
using ExpenseTracker.Server.Entities;
using ExpenseTracker.Server.Services;
using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));

builder.Services.AddControllers().AddJsonOptions(x =>
                x.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles);

builder.Services.AddRazorPages();  // Combine razor pages and api

// For Entity Framework
builder.Services.AddDbContext<ExpenseTrackerDbContext>(options =>
{
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"));
});

// For DI registration
builder.Services.AddTransient<IExpenseTrackerService, ExpenseTrackerService>();

builder.Services.AddEndpointsApiExplorer();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseWebAssemblyDebugging();
}

app.UseHttpsRedirection();

app.UseStaticFiles(); // to laod wasm static files

app.UseBlazorFrameworkFiles(); //  a special middleware component to serve the client 

app.UseAuthorization();

app.MapRazorPages(); // Combine razor pages and api

app.MapControllers();// handle /api

app.MapFallbackToFile("index.html");  // handle  everything else

app.Run();

ExpenseTracker.Client 的 program.cs

using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
using ExpenseTracker.Client;
using MudBlazor.Services;

var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
builder.RootComponents.Add<HeadOutlet>("head::after");

builder.Services.AddMudServices();

builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });

await builder.Build().RunAsync();

原因及解决方案

1. GitLab CI脚本未执行实际部署操作

当前CI脚本仅输出提示语句,没有运行Azure静态Web应用的部署命令,导致API项目未被部署到Azure。

修改gitlab-ci.yaml的script部分,添加完整部署流程:

script:
  - dotnet publish $API_PATH -c Release -o $PUBLISH_DIR
  - /bin/bash -c "if [ -z \"$AZURE_STATIC_WEB_APPS_API_TOKEN\" ]; then echo \"AZURE_STATIC_WEB_APPS_API_TOKEN is not set\"; exit 1; fi"
  - swa deploy $APP_PATH --api-location $PUBLISH_DIR --output-location $OUTPUT_PATH --api-token $API_TOKEN

2. staticwebapp.config.json路由配置错误

现有路由规则会将所有/api/*请求强制指向/api根路径,导致具体API接口(如/api/expenses)无法被正确路由到后端控制器。

删除错误路由规则,Azure静态Web应用会自动将/api前缀请求转发到部署的API后端,修改后的配置:

{
    "navigationFallback": {
        "rewrite": "/index.html"
    }
}

3. 验证API控制器路由特性

确保ExpenseTracker.Server中的控制器添加了正确的路由特性,例如:

[ApiController]
[Route("api/[controller]")]
public class ExpensesController : ControllerBase
{
    // 控制器方法
}

该特性保证/api/expenses这类请求能正确映射到对应控制器方法。


内容的提问来源于stack exchange,提问作者hanushi-thana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 05:19:53