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

K8s集群中NextJS调用.NET服务仅GET请求可用求助

排查建议

1. 先验证集群内部后端服务的可用性

前端Pod在集群内部可以直接访问后端服务,先排除后端接口本身的问题:

# 进入前端Pod
kubectl exec -it <你的front-pod名称> -- sh
# 测试POST请求(替换成你的实际接口路径)
curl -X POST http://produtos-service/api/produtos -d '{"nome":"测试","preco":10}' -H "Content-Type: application/json"
# 测试PUT/DELETE请求
curl -X PUT http://produtos-service/api/produtos/1 -d '{"nome":"更新测试","preco":15}' -H "Content-Type: application/json"
curl -X DELETE http://produtos-service/api/produtos/1

如果这些请求在Pod内部都失败,说明后端服务的POST/PUT/DELETE接口本身存在问题(比如路由配置错误、数据库权限、业务逻辑异常),优先排查.NET后端代码。

2. 检查前端客户端请求的目标地址

你给的前端环境变量URL_PRODUTOS设为produtos-service,这是K8s内部的ClusterIP服务域名——但前端在浏览器中运行时,浏览器无法解析K8s内部的服务域名!
这是核心问题:GET请求正常很可能是NextJS在服务端渲染阶段发起的(服务端在集群内部,能解析服务名),而POST/PUT/DELETE是浏览器端触发的,浏览器找不到produtos-service这个域名,导致请求异常。

验证方式:打开浏览器DevTools的Network面板,查看POST/PUT请求的URL是否为http://produtos-service/...,如果是,直接确认是这个域名解析问题。

3. 修正前端API请求的地址方案

方案A:用NextJS API Route做代理(推荐)

这就是你提到的方案,前端客户端请求自身的API路由,再由路由转发到后端服务。
在pages/api/produtos/[...path].js中添加代理逻辑:

export default async function handler(req, res) {
  const { method, body, query } = req;
  const backendUrl = `http://produtos-service/api/produtos/${query.path.join('/')}`;

  try {
    const response = await fetch(backendUrl, {
      method,
      headers: {
        'Content-Type': 'application/json',
      },
      body: method !== 'GET' ? JSON.stringify(body) : undefined,
    });
    const data = await response.json();
    res.status(response.status).json(data);
  } catch (error) {
    res.status(500).json({ error: '后端服务请求失败' });
  }
}

之后前端客户端请求/api/produtos/...即可,无需直接访问后端服务域名。

方案B:暴露后端服务到外部(测试用)

将produtos-service改为NodePort类型,让浏览器能通过节点IP+端口访问:

apiVersion: v1
kind: Service
metadata:
  name: produtos-service
spec:
  type: NodePort
  selector:
    app: produtos
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
      nodePort: 30200 # 选择未被占用的端口

然后修改前端环境变量为节点IP+端口:

env:
- name: URL_PRODUTOS
  value: <你的K8s节点IP>
- name: PORT_PRODUTOS
  value: "30200"

生产环境建议用Ingress统一管理外部访问。

4. 确认.NET的CORS配置顺序与规则

虽然你已经配置了CORS,但要确保中间件顺序正确,且策略允许所有HTTP方法:

var builder = WebApplication.CreateBuilder(args);

// 添加CORS策略
builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowAll", policy =>
    {
        policy.AllowAnyOrigin()
              .AllowAnyMethod() // 必须显式允许所有方法,否则默认只允许GET/HEAD/OPTIONS
              .AllowAnyHeader();
    });
});

builder.Services.AddControllers();

var app = builder.Build();

app.UseRouting();

// CORS中间件必须放在UseRouting之后,UseAuthorization之前
app.UseCors("AllowAll");

app.UseAuthorization();

app.MapControllers();

app.Run();

5. 检查浏览器的CORS预检请求

非GET/HEAD的请求会先发送OPTIONS预检请求,确认后端允许跨域。在DevTools中查看OPTIONS请求的状态:

  • 如果是404:说明后端没有正确处理OPTIONS请求,检查.NET路由是否拦截了预检请求
  • 如果是500:检查后端服务是否在处理预检时抛出异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 18:55:08