代码之家  ›  专栏  ›  技术社区  ›  Bassie

allowanymethod适用于某些API调用,但不适用于其他调用

  •  1
  • Bassie  · 技术社区  · 6 年前

    我有中提到的表格 this question 但是当我提交它的时候

    跨源请求被阻止:同一源策略不允许读取位于的远程资源 http://localhost:1113/api/loans . (原因:缺少CORS头“访问控制允许来源”)。

    跨源请求被阻止:同一源策略不允许读取位于的远程资源 http://localhost:1113/api/贷款 . (原因:CORS请求未成功)。

    我之前已经为另一个API调用修复了这个问题,将它添加到我的API Configure 在里面 Startup :

    app.UseCors(options => options.WithOrigins("*").AllowAnyMethod());
    

    但现在出于某种原因,它阻止了行动所在的呼叫

    // POST api/loans
    [HttpPost]
    public void Post(Loan loan)
    {
        _context.Loans.Add(loan);
        _context.SaveChanges();
    }
    

    为什么?

    2 回复  |  直到 6 年前
        1
  •  1
  •   johnny 5    6 年前

    这是一个模糊的问题,所以我会给你一些建议。

    1. 首先打开所有异常 在CORS发生之前,你有可能会遇到一个例外,所以你可以申请 正在返回错误响应,然后才能添加CORS头。

    2. .NET核心需要属性来解析如何对数据进行模型绑定。所以,HTTP Post方法应该需要[FromForm]或[FromBody]属性

      [HttpPost]
      public void Post([FromForm] Loan loan)
      {
          _context.Loans.Add(loan);
          _context.SaveChanges();
      }
      
    3. 确保你使用的是CORS政策。除非使用旧版本的.NET核心,否则应该从配置服务方法而不是配置方法实现CORS策略。

    试着像这样执行你的政策:

    services.AddCors(options =>
    {
        options.AddPolicy(DEFAULT_POLICY_NAME, policy =>
        {
            policy.SetIsOriginAllowedToAllowWildcardSubdomains() 
                 .AllowAnyOrigin()
                 .AllowAnyHeader()
                 .AllowAnyMethod()
                 .AllowCredentials();
        });
    });
    

    然后在配置方法中,只使用策略名称

    app.UseCors(DEFAULT_POLICY_NAME);
    
        2
  •  1
  •   Sajeetharan    6 年前

    试用使用 [FromBody]

    public void Post([FromBody] Loan loan)
    

    另外,当您试图发送时,使用json.stringify而不是modle直接发送,

    this.http.post('http://localhost:1113/api/loans', JSON.stringify(this.model), config).subscribe(data => {
      console.log(data);
    });