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

生产环境下配置Angular Azure Static Web App连接外部.NET Web API(无Azure Function Proxy)遇405错误

排查Azure Static Web App调用.NET Web API 405错误的解决方案

核心问题说明

405错误意味着请求方法不被目标服务器允许,但你本地代理能正常运行,说明问题出在Azure静态Web App的生产环境配置上——注意:angular.json里的代理配置只在本地开发环境生效,部署到Azure后完全不生效,必须用Azure专属的路由规则来配置转发。

具体排查与解决步骤

1. 用Azure静态Web App路由规则替换Angular代理

在项目根目录创建staticwebapp.config.json文件,这是Azure静态Web App的专属配置文件,用来处理路由和代理:

{
  "routes": [
    {
      "route": "/api/*",
      "rewrite": "/api/{*}",
      "allowedMethods": ["GET", "POST", "PUT", "DELETE", "OPTIONS"],
      "backend": {
        "url": "https://xxxxxx.azurewebsites.net/api/{*}"
      }
    }
  ],
  "globalHeaders": {
    "Access-Control-Allow-Origin": "*",
    "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
    "Access-Control-Allow-Headers": "Content-Type, Authorization"
  }
}
  • allowedMethods要包含你调用API用到的所有HTTP方法,别漏了OPTIONS(预检请求会用到)
  • backend.url要和你的API服务器地址完全匹配,{*}是路径占位符,用来匹配/api后的所有子路径

2. 检查后端.NET Web API的CORS配置

即使Azure配置了跨域头,后端API也必须正确启用CORS才能接收请求:
在.NET项目的Program.cs中添加以下代码:

builder.Services.AddCors(options =>
{
    options.AddPolicy("AzureStaticAppCors", policy =>
    {
        policy.WithOrigins("https://你的静态Web App地址.azurestaticapps.net")
              .AllowAnyMethod()
              .AllowAnyHeader();
    });
});

// 注意要放在UseRouting之后,UseAuthorization之前
app.UseCors("AzureStaticAppCors");
  • 替换成你自己的Azure静态Web App实际地址,生产环境别用AllowAnyOrigin(),指定具体来源更安全

3. 验证后端API的路由与请求方法匹配

  • 检查后端控制器的路由特性,比如前端请求/api/users,后端控制器是否有[Route("api/[controller]")]标注
  • 确认对应接口的HTTP方法特性正确,比如POST请求对应[HttpPost],别写错成[HttpGet]

4. 检查Azure Web App的HTTP限制

登录Azure门户,找到你的.NET Web App:

  • 进入配置 > 常规设置,确认HTTP版本设置为2.0或更高
  • 检查是否有应用服务防火墙(WAF)规则拦截了特定HTTP方法,必要时暂时关闭测试

5. 测试OPTIONS预检请求

405错误常伴随OPTIONS预检请求失败,用Postman直接请求你的API地址:

OPTIONS https://xxxxxx.azurewebsites.net/api/你的接口路径

如果返回405,说明后端没处理OPTIONS请求,在Program.cs中添加中间件处理:

app.Use(async (context, next) =>
{
    if (context.Request.Method == "OPTIONS")
    {
        context.Response.StatusCode = StatusCodes.Status200OK;
        await context.Response.WriteAsync(string.Empty);
        return;
    }
    await next();
});

内容的提问来源于stack exchange,提问作者Lluthus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:01:17